手动调用析构函数后如何删除内存?

时间:2012-02-07 17:47:35

标签: c++ memory

我正在阅读这个问题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)或类似的东西而不只是针对记忆吗?

2 个答案:

答案 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;
}