我读过,一旦抛出异常,超出范围的对象将被销毁。所以我写了一个代码来测试它。
#include "stdafx.h"
#include <iostream>
using namespace std;
class E {
public:
int v = 0;
};
void f() {
E e;
E *pointer = &e;
e.v = 7;
throw pointer;
}
int main(void) {
E* MainPointer = new E;
try {
f();
}
catch (E* e) {
cout << e -> v; //was executed
MainPointer = e;
}
cout << MainPointer->v; //was executed
system("pause");
return 0;
}
输出为77,意味着catch块和最终cout都被执行了。但是我期待最后一个cout的内存错误,因为MainPointer指向的对象现在应该被释放了。
有人可以澄清为什么在f()中声明的对象没有被释放。
答案 0 :(得分:2)
你有两个误解,共同创造了这个问题。真相就是那个
根据(1)e
内部声明的局部变量f()
被销毁。根据(2),您可以访问释放的内存,并且您可以获得正确的值。检查e
是否被销毁的唯一方法是定义class E
的析构函数以便能够跟踪它。析构函数将被调用。
答案 1 :(得分:0)
在异常发生时堆栈展开。在堆栈上分配的对象被销毁但是使用operator new
在堆上分配的对象没有。您必须手动销毁它们或将它们包装到unique_ptr。