【发布时间】:2019-08-12 08:28:12
【问题描述】:
以下是我的示例代码。基类有一个 A 类指针,使用 new 运算符从堆分配内存。我明确地抛出了一个异常。由于我没有在 *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();
}
【问题讨论】:
-
"我想知道我们如何关闭文件处理程序的文件处理程序在构造函数中打开并且构造函数有异常?"
try { ... } catch() { myfile.close(); throw; }
标签: c++ exception constructor