内存释放和异常

bre*_*ett 6 c++ exception

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

Ben*_*oît 5

在您描述的情况下,内存将会泄漏.

避免这个问题的两个技巧:

  • 使用智能指针,它没有遇到同样的问题(首选解决方案)
    - >堆栈中构造的智能指针,因此无论如何调用其析构函数,并在析构函数中提供删除指向的内容

  • 使用try/catch语句,并删除catch语句中的项目


wil*_*ell 4

这取决于它在哪里deletecatch如果它在捕获异常的内部,它可能会调用。

try {
    f();  // throws
} catch( ... ) {
    delete p;  // will delete
}
Run Code Online (Sandbox Code Playgroud)

catch如果在捕获异常之后并且catch没有从函数返回(即允许执行流在catch块之后继续进行),则delete可能会调用 。

try {
    f();  // throws
} catch( ... ) {
    // execution proceeds beyond catch
}
delete p;  // will delete
Run Code Online (Sandbox Code Playgroud)

如果delete不在允许继续执行的块中catch或块之后,则不会调用 。catchdelete

try {
    f();  // throws
    delete p;  // will not delete
}  // ...
Run Code Online (Sandbox Code Playgroud)

正如您可能想象的那样,在上面的前两种情况下,delete如果 之前有一个 throw ,则不会调用delete

try {
    f();  // throws
} catch( ... ) {
    g();  // throws
    delete p;  // will not delete
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,异常是好的,因为您不必在调用堆栈中的每个函数中捕获它们。它们可以在一个“外部”层面上进行咳嗽。如何释放内部函数中分配的内存?例如 if 函数 f() 抛出异常分配的内存。捕获 f() 中的异常并释放内存,然后将其重新抛出到调用堆栈中的下一级是个好主意吗? (2认同)