内存释放和异常

时间:2010-08-15 07:05:23

标签: c++ exception

我有一个关于内存释放和异常的问题。当我使用delete删除在堆上创建的对象时。如果在此删除之前发生异常,则内存将泄漏或此删除将执行?

4 个答案:

答案 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”。