我正在查看this文章 它说明了
注意:如果构造函数通过抛出异常完成内存 与对象本身相关联被清理 - 没有记忆 泄漏。例如:
void f()
{
X x; // If X::X() throws, the memory for x itself will not leak
Y* p = new Y(); // If Y::Y() throws, the memory for *p itself will not leak
}
我很难理解这一点,如果有人能澄清这一点,我会很感激。我尝试了以下示例,该示例显示构造函数中的异常,不会调用析构函数。
struct someObject
{
someObject()
{
f = new foo();
throw 12;
}
~someObject()
{
std::cout << "Destructor of someobject called";
}
foo* f;
};
class foo
{
public:
foo()
{
g = new glue();
someObject a;
}
~foo()
{
std::cout << "Destructor of foo";
}
private:
glue* g;
};
int main()
{
try
{
foo a;
}
catch(int a)
{
//Exception caught. foo destructor not called and someobject destrucotr not called.
//Memory leak of glue and foo objects
}
}
我该如何解决这个问题?
很抱歉更新可能造成的不便。
答案 0 :(得分:3)
&#34; ...不会调用析构函数。&#34;
由于该对象尚未被视为已构造,因此在构造函数因异常而失败后,析构函数将不会被调用。
对象分配和构造(仅仅是破坏)是不同的东西。
抛出异常之前使用new()
分配的任何对象都会泄漏。
你不应该自己管理这些资源,除非你真的,真的,真的需要它,并且对你正在做的事情100%肯定。
而是为standard dynamic memory management library中的类成员使用合适的智能指针。
答案 1 :(得分:3)
当构造函数抛出时,不会调用析构函数。当一个 在构造函数中抛出异常有几件事情 你应该注意妥善处理资源 在中止建设中可能发生的分配 对象: