2012-02-07 129 views
1

我在读这个问题Does calling a destructor explicitly destroy an object completely?这种情况出现在代码中。手动调用析构函数后如何删除内存?

Object* aWidget = new Widget(); //allocate and construct 
aWidget->~Object();    //destroy and DON'T deallocate 

从答案,我undrestand,内存区域实际上不会在这种情况下释放。我的问题是(更多的好奇心比任何东西):

如何删除上面的两行代码执行后由aWidget指向的内存?我会假设调用delete aWidget;会失败,因为它会尝试在已经被破坏的对象上运行析构函数。你可以打电话free(aWidget)或类似的东西,而只是针对内存?

+0

我不能肯定,所以我张贴的评论,但你可以叫'delete操作符(aWidget)'。尽管如此,我仍然很想看到作为有效用例遇到的代码。 – 2012-02-07 17:52:23

+0

@CoryNelson你是对的,看我的答案。我在发布评论时正在输入它。 – 2012-02-07 17:57:13

回答

3

free事实上,这是我最好的猜测。不过我不认为你可以在不调用UB的情况下任何东西。你是如何得到调用这样的析构函数的要求的?

+0

我其实没有,我只是在阅读我引用的问题,并对他们如何解决他们所处的情况感到好奇。尽管如此,我已经在使用placement的程序中看到类似这样的析构函数调用。 – 2012-02-07 18:01:57

+0

@ w00te:是的,它与放置新的不同;) – 2012-02-07 18:02:55

1

在分配有new的对象上调用free未定义的行为

我建议你保持简单,并致电delete

不过,如果你想这样做,你可以,在某些情况下,调用delete即使您以前称为析构函数明确。如果你明确地调用它,你可以把它看作一个函数。内存不释放,所以我猜测设置成员指针NULL后,你摧毁他们将足以防止你遇到任何麻烦。 (因为在NULL指针上调用delete是无操作)。

例如,下面应该确定:

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