我正在阅读这个问题Does calling a destructor explicitly destroy an object completely?,这种情况出现在代码中。
Object* aWidget = new Widget(); //allocate and construct
aWidget->~Object(); //destroy and DON'T deallocate
从答案来看,我觉得在这种情况下,记忆区域实际上并未解除分配。我的问题是(出于好奇而不是任何事情):
在执行上面两行代码后,如何删除aWidget指向的内存?我会假设调用delete aWidget;
会失败,因为它会尝试在已经被破坏的对象上运行析构函数。你可以打电话给free(aWidget)
或类似的东西而不只是针对记忆吗?
答案 0 :(得分:3)
free
是我最好的猜测。但是我不认为你可以在不调用UB的情况下做任何事情。你是如何达到这样要求调用析构函数的?
答案 1 :(得分:1)
对分配有free
的对象调用new
是未定义的行为。
我建议您保持简单,并致电delete
。
但是,如果你想这样做,你可以 ,在某些情况下,即使你之前明确地调用了析构函数,也可以调用delete
。如果明确调用它,则可以将其视为函数。内存没有被释放,所以我猜你在销毁它们之后设置成员指针NULL
就足以防止你遇到任何麻烦。 (因为在delete
指针上调用NULL
是无操作的。
例如,以下内容应该没问题:
class A
{
public:
int * x;
A()
{
x = new int[10];
}
~A()
{
delete[] x;
x = NULL;
}
};
int main()
{
A* a = new A;
a->~A();
delete a;
return 0;
}