c++ - 一个对象可以释放它的内存吗?

标签 c++ delete-operator

<分区>

Possible Duplicates:
C++: Delete this?
Object-Oriented Suicide or delete this;

我正在通过阅读非常好的书 C++ Primer 来学习 C++,我正在学习 C++ 如何通过 delete 关键字释放内存,就像 C 使用 free 一样。 Java 和 Pascal 没有这种显式释放内存的机制。如果程序运行时间过长,可能会导致程序出错,并且需要的变量会被破坏,因此不应将其简单化。

简而言之,我想知道在 C++ 中,变量执行 this.delete() 并删除 自身 是否合法或可取。我们大多听说过 C 和 C++ 中的释放指针,这是通过新的 freedelete 关键字完成的。 Pascal 也有指针,但 Java 没有。所以在 Java 中它应该是不可能的,因为你没有显式删除对象,C 没有对象所以 struct 不能 free 它被分配的内存,即使这在技术上是可行的,因为 C 没有对象,Pascal 也没有。

所以我想我的问题留给 C++ 了,对象使用 this.delete() 之类的方法删除自身是否合法?

最佳答案

对象完全有可能执行delete this;

但是,这样做之后,使用 this 是未定义的行为。

所以,如果你非常小心 was is done after after,一个对象通过 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;
}

关于c++ - 一个对象可以释放它的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10783479/

相关文章:

c++ - 在动态分配内存时使用指定大小

c++ - 正则表达式慢

c++ - 在 ubuntu 20.04 上安装 Catch2 #include <catch2/catch.hpp>

c++ - 如何获取应用程序的所有鼠标事件?

c++ - 重载Delete,在特定程序中

c++ - 与 c++ 中的删除功能混淆

C++ 项目到 linux

c++ - "using Time = cppClassDefinition<withT>"的 Cython 等价物

c++ - 如何释放动态结构数组的内存

c++ - 如何通过首先检查它们是否用 New() 初始化来删除 vtk 对象?