我正在阅读 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 指向的内存泄漏。
最佳答案
如果 Y 的构造函数抛出异常,则堆栈将展开,包括删除为 Y 分配的内存。
问题主要出现在当/如果您有多个对象需要处理时。例如:
void f() {
X *x = new X();
Y *y = new Y();
}
现在,如果 new X()
部分成功,但 new Y()
部分失败,则为 y
分配的内存将被删除,但是 x
不会被销毁,并且它的内存会被泄漏。如果您确实坚持的话,您可以使用try
block 解决这个问题:
try {
X *x = new X();
Y * y = new Y();
}
catch (y_construction_failed) {
delete x;
}
这样做的一个大问题是,如果你有两个以上的项目,你就必须嵌套 try
block ,所以如果你需要,比如说,六个局部变量,它会很深嵌套且极其丑陋。
关于c++ - 处理失败的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934338/