【发布时间】:2013-11-12 16:18:16
【问题描述】:
我正在阅读来自 C++ FAQ 的失败构造函数,但不理解以下代码。
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
}
如果构造函数抛出,p指向的内存怎么可能不会泄漏?我假设顺序如下。
- 为对象 Y 分配内存。
- Y 的构造函数被调用。
- Y 的构造函数抛出和 p 指向的内存泄漏。
【问题讨论】:
-
您遗漏了第 4 步,释放了 p 的内存。为什么你认为这是不可能的?
-
我可以知道 Y 的内部结构可能会在 Y 的构造函数中应用 RAII,但是删除 p 是什么?
-
::operator new 承诺分配内存,调用构造函数,如果抛出再次释放。很容易实现。
-
知道了!所以在“特殊”情况下 new 也会调用删除。
-
@goldcode 没错
标签: c++ exception constructor