例如我有一个简单的代码:
class B
{
};
class A
{
B b;
public:
A()
{
throw 1;
}
};
int main()
{
A* a = 0;
try
{
a = new A;
}
catch (int)
{
}
}
构造函数A抛出异常,则不会调用析构函数。但是 B 的析构函数将被调用。不会分配堆中的内存。我的问题是这在内部如何运作?首先是什么:构造 A 还是在堆中分配内存?那么,如果allocating是第一个,如果有exception怎么处理deallocating呢?否则,如果构造 A 是第一个,它是如何复制到堆中的?
最佳答案
- 内存已分配。
- A的构造函数被调用。
- A的构造函数调用B的构造函数。
- A 的构造函数抛出。
- 作为标准异常处理程序的一部分,B 的析构函数被调用(RAII 在工作)。
- 堆栈展开到调用者(main)。
- 内存已释放(因为对象未成功构造)。
A 的析构函数未被调用,因为该对象未完全构造。但是, 完全构建的成员仍然被破坏。
当控件离开 block 时,内存会以与局部变量被销毁的方式几乎相同的方式自动释放。如果您熟悉 Java 和/或 C#,可以将其视为不可见的 try-finally
结构。或者一系列这样的结构。
关于c++ operator new 这在内部是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40421791/