大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
在有两种情况下会调用析构函数。
第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete。
第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。
如果是第二种情况发生时,在析构函数中也抛出一个异常,则c++会调用terminate()来终止程序。例如:
class Object
{
public:
    Object() 
{cout<<"Default"<<endl;}

    
~Object() 
    
{
        
throw exception();
        cout
<<"Destructor"<<endl;
    }


}
;

void Test()
{
    Object obj;
    
throw exception();
}
    

int main(int argc, char *argv[])
{
    
try
    
{
        Test();
    }

    
catch()
    
{

    }


    
return 0;
}

所以为了防止terminate()被调用,并且在析构函数中完成资源释放,不能让异常传递到析构函数之外。
将可能产生异常的语句包含在try内,保证不会有异常传递到析构函数之外,并且让析构函数执行完。
上述析构函数可定义如下:
    ~Object() 
    
{
        
try
        
{
            
throw exception();
        }

        
catch()
        
{

        }

        cout
<<"Destructor"<<endl;
    }

posted on 2009-05-25 16:37 大胖 阅读(211) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理