假设有这样一个函数
B::virtual void fun(int i)
{
while(i--)
{
A* ptr=readdata(i);//其中A为抽象基类
ptr->fun1();//假设fun1是A中的纯虚函数
delete ptr;
}
}
对于上面的代码,当ptr->fun1();出了异常,则程序永远不会delete ptr,造成资源的泄漏。
要避免这一点,可以这样写
B::virtual void fun(int i)
{
while(i--)
{
A* ptr=readdata(i);
try{
ptr->fun1();
}
catch(...){
delete ptr;
throw();
}
delete ptr;//没有异常抛出时,delete ptr
}
}
这样很麻烦,delete ptr 重复了。
解决办法:
以一个“类似指针的对象”取代指针(智能指针)。
我们可以在智能指针的析构函数中将指针delete。
因为,局部对象总是在函数结束时被析构。
c++中的智能指针:auto_ptr、shared_ptr.weak_ptr、unique_ptr
参考自more effective c++。