在函数内发生异常可以在两个地方处理,一个是throw然后在函数外的try块catch捕获;另一种直接在函数体内设置try块catch捕获.....往往可能出现内存泄露的就是第一种---通过throw的方式..
一旦throw,则直接跳出函数体,这个时候会释放函数体内的对象(如果对象尚未构建完成则不会析构释放,这种往往是自己重写new的时候会发生).
下面来段小代码可以看出内存泄露了(实际编程肯定不会这样写):
复制内容到剪贴板代码:
class cat{
public:
cat(){ cout<<"creat cat"<<endl;}
~cat(){cout<<"destroy cat"<<endl;}
};
class fate
{
cat* p;
public:
fate():p(0){ p=new cat[5]; throw 2; }
~fate() { delete [] p; }
};
int main(void)
{
try{
fate f;
}
catch(int){
cout<<"oh my god!"<<endl;
}
return 0;
}