如果我从构造函数中抛出异常,构造函数中的释放内存会发生什么?
问题描述:
如果我在构造函数中使用new分配一些内存,如果在分配内存窗体构造函数后抛出异常,内存是否会被回收或内存泄漏?如果我从构造函数中抛出异常,构造函数中的释放内存会发生什么?
class A
{
public:
A()
{
p = new int(4);
throw 1;
}
~A()
{
delete p;
}
private:
int *p;
};
答
内存不会被回收。即使你有一个析构函数(和复制/赋值操作符),它仍然会泄漏内存。
任何完整构造的子对象将在抛出后被破坏。在这种情况下,p
会被破坏,这与p
指向的内存不会混淆:它们是两个完全不同的东西,内存实际上会被泄漏。
如果你这样做*没有抛出异常,你认为会发生什么?你有一个没有“删除”的“新” - 这是不好的。 – 2014-09-22 19:01:53
这是写入这是一个内存泄漏等待*无论抛出异常。为了解决你的问题,在构造函数的初始化程序中使用'std :: vector p;',然后'p(4)'。然后抛出你想要的。 [指针不应拥有资源](https://dl.dropboxusercontent.com/u/6101039/Modern%20C%2B%2B.pdf)。 –
WhozCraig
2014-09-22 19:03:12
好的约瑟夫。我添加了析构函数 – kadina 2014-09-22 19:05:10