下面是我的示例代码。基类有一个A类的指针,使用新的运算符从堆中分配了内存。我明确地抛出异常。由于我没有在* ptr上调用delete,因此不会释放new分配的内存。由于对象不是完全构造的,我们如何释放内存?
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A::ctor"<<endl;
}
~A()
{
cout<<"A::Dctor"<<endl;
}
};
class Base
{
public:
A *ptr;
Base()
{
ptr = new A();
cout<<"Base::Ctor"<<endl;
throw std::exception();
}
~Base()
{
delete ptr;
cout<<"Base::Dtor"<<endl;
}
};
int main()
{
try{
Base bobj;
}
catch(exception e)
{
cout<<e.what();
}
return 0;
}
当Base构造函数引发异常时,控件转到catch块并处理异常。但是ptr = new A();
分配的内存如何释放?
现在,我知道使用智能指针可以解决此问题。但是在C ++ 11之前,如何处理这种情况。
此外,我想知道我们如何关闭在构造函数中打开的文件处理程序的文件处理程序,并且构造函数有异常?
Base()
{
ofstream myfile;
myfile.open("myfile.txt");
..........
throw std::exception();
}
~Base()
{
myfile.close();
}
答案 0 :(得分:5)
与ptr
关联的内存永远不会释放!
是的,那总是一个问题。
在C ++ 11之前,您可以构建自己的智能指针类(或在Boost中使用它),或者在抛出异常之前注意delete
。将ptr
放在基类中也是一种选择:基类构造函数将在到达派生构造函数的函数体之前完成。