在您描述的情况下,内存将会泄漏.
避免这个问题的两个技巧:
使用智能指针,它没有遇到同样的问题(首选解决方案)
- >堆栈中构造的智能指针,因此无论如何调用其析构函数,并在析构函数中提供删除指向的内容
使用try/catch语句,并删除catch语句中的项目
这取决于它在哪里delete。catch如果它在捕获异常的内部,它可能会调用。
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)