【问题标题】:How do I delete memory after manually invoking destructor?手动调用析构函数后如何删除内存?
【发布时间】:2012-02-08 01:56:21
【问题描述】:

我正在阅读这个问题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) 或类似的东西来只针对内存吗?

【问题讨论】:

  • 我不确定,所以我将发布作为评论,但您可以致电 operator delete(aWidget)。不过,我很想看到将其作为有效用例的代码!
  • @CoryNelson 你是对的,看看我的回答。当你发表评论时,我正在输入它。

标签: c++ memory


【解决方案1】:

free 实际上是我的最佳猜测。但是我不认为你可以在不调用 UB 的情况下做 任何事情。您是如何达到这样调用析构函数的要求的?

【讨论】:

  • 我实际上并没有,我只是在阅读我引用的问题,并对他们如何解决他们遇到的情况感到好奇。我在使用placement new的程序中看到过这样的析构函数调用。
  • @w00te:是的,新展示位置不同;)
【解决方案2】:

在分配有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;
}

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2014-12-27
    • 2021-04-24
    • 2016-02-16
    • 2012-03-13
    • 2011-11-01
    • 2013-10-04
    • 2021-07-16
    相关资源
    最近更新 更多