我有一个关于内存释放和异常的问题。当我使用delete删除在堆上创建的对象时。如果在此删除之前发生异常,则内存将泄漏或此删除将执行?
答案 0 :(得分:5)
在您描述的情况下,内存将会泄漏。
避免此问题的两个技巧:
使用智能指针,它不会遇到同样的问题(首选解决方案)
- >在堆栈上构造智能指针,因此无论如何调用其析构函数,并在析构函数中提供删除指向的内容
使用try / catch语句,并删除catch语句中的项目
答案 1 :(得分:4)
这取决于delete
的位置。如果它位于捕获异常的catch
内,则可能会调用。
try {
f(); // throws
} catch( ... ) {
delete p; // will delete
}
如果它在捕获异常的catch
之后并且catch
没有从函数返回(即允许执行流程在catch
块之后继续)那么{{可能会被调用。
delete
如果try {
f(); // throws
} catch( ... ) {
// execution proceeds beyond catch
}
delete p; // will delete
不在delete
块中,或者在允许执行的catch
块之后,则catch
将不会调用。
delete
正如您可能想象的那样,如果在try {
f(); // throws
delete p; // will not delete
} // ...
之前有一次投掷,则在上面的两个第一种情况下不会调用delete
:
delete
答案 2 :(得分:2)
不会被调用。这就是为什么鼓励你看RAII的原因。见Stroustrup
答案 3 :(得分:0)
我们还必须确保“异常”真正意味着可以通过try / catch捕获的C ++异常。在C ++ try / catch无法捕获的系统中还有其他例外(例如除以0)。
在这种情况下(超出C ++标准的范围),除非捕获这些异常并且处理程序明确地适当地调用“delete”,否则不会执行“delete”。