一个对象可以释放它的记忆吗?

Nik*_*ntz 5 c++ delete-operator

可能重复:
C++:删除这个?
面向对象的自杀或删除此;

我正在通过阅读非常好的C++ Primer来学习C++,并且我正在学习C++如何通过delete像C这样的关键字释放内存free.Java和Pascal没有这种用于释放内存的机制.如果程序运行很长时间并且变量被破坏,那么它可能会导致程序错误,因此不应该忽略它.

简而言之,我想知道它是合法的还是可以推荐的,例如在C++中变量可以做this.delete()和删除自己.我们大多听说过在C和C++中释放指针,这是用新的freedelete关键字完成的.Pascal也有指针,但Java没有.所以在Java中它不应该是可能的,因为你没有明确删除对象,C没有对象,因此一个struct不能free为它分配即使因为C没有对象也不是技术上是可行的内存确实帕斯卡.

因此,我认为离开C++是为了我的问题,对象是否合法删除自己的类似的东西this.delete()

Mes*_*sop 6

对象完全可以做到delete this;.

但是,执行此操作后,使用this是一种未定义的行为.

所以,如果你非常小心,事后做了,对于一个"自杀"的对象是好的和合法的 delete this;

但是,这真的不是一个好主意,特别是因为它意味着你的类只应该由new实例化,因为te栈上的分配可能导致析构函数被调用两次:删除它,以及离开上下文时.

以下示例说明了为什么它不是一个好主意:

class A
{
public:
    ~A() { std::cout << "Destructor"; }
    void foo() { delete this; } 
};

int main()
{
    {
        A a;
        a.foo(); // OK, a is deleted
    } // Going out of context, the destructor is called again => undefined behavior
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @NickRosencrantz:在大多数其他语言中,未定义的行为*不存在*.在C++中,它应该像瘟疫一样避免,因为根据定义,它是不可靠的.一旦输入未定义的行为,您就无法信任该程序. (3认同)

Luc*_*ore 5

this 一个指针.正确的语法是

 delete this;
Run Code Online (Sandbox Code Playgroud)

是的,这是可能的,但它会使您的对象和指向您的对象的指针无法使用.

看到这个是为了一个好的阅读.

在实践中,使用这种技术是一种代码味道,除非你完全确定你在做什么.