C++ 是";删去这句话;坏主意?

C++ 是";删去这句话;坏主意?,c++,memory-management,C++,Memory Management,可能重复: 我在一个类上做了一些工作,这个类被设计成链接列表中的一个节点,我想我应该给这个类提供自己的删除功能,而不是让管理类这样做。所以基本上是这样的: void Class::Delete() { //Some cleanup code before deleting the object delete this; } 现在我已经测试过了,它看起来很好,但是在过去,对象已经在运行代码中间,已经被删除,然后明显地通过试图使用一个不再存在的对象来破坏程序。 由于“delete

可能重复:

我在一个类上做了一些工作,这个类被设计成链接列表中的一个节点,我想我应该给这个类提供自己的删除功能,而不是让管理类这样做。所以基本上是这样的:

void Class::Delete() {
    //Some cleanup code before deleting the object
    delete this;
}

现在我已经测试过了,它看起来很好,但是在过去,对象已经在运行代码中间,已经被删除,然后明显地通过试图使用一个不再存在的对象来破坏程序。 由于“deletetthis”正好位于函数的末尾,因此它显然退出了函数并运行良好,但这种做法是不是一个坏主意?如果我不小心,这会不会在我脸上爆炸?

答案很好:

只要你小心,这对你来说是可以的 要自杀的对象(删除 这个)

以下是我对“小心”的定义:

  • 你必须百分之百肯定这个物体 通过new分配(不是通过new[],也不是 通过放置新对象,也不是本地对象 在堆栈上,既不是全局的,也不是 另一个物体的成员;但是通过简单的方式 普通(新)
  • 您必须100%肯定您的会员 函数将是最后一个成员 在此对象上调用的函数
  • 你必须百分之百地肯定你的其余部分 成员函数(在删除此 线)不接触任何一块 对象(包括调用任何其他 成员函数或触摸任何数据 成员)
  • 你必须百分之百肯定没有人碰你 在 删除这一行。换句话说,你 千万不要检查它,把它和 另一个指针,将其与NULL进行比较, 打印它,铸造它,用它做任何事 它
  • 当然,通常的警告适用于 如果您的this指针是 不使用时指向基类的指针 有一个虚拟析构函数


    基本上,您需要像处理
    delete
    ing任何其他指针一样小心。但是,与显式声明的指针相比,成员函数自杀可能会在更多方面出错。

    有一种简单的方法可以做同样的事情,而不涉及未定义的行为:

    void Class::Delete() {
        //Some cleanup code before deleting the object
        std::auto_ptr delete_me(this);
    }
    

    如果不确定是否存在陷阱,那么使用
    删除此
    是一个坏主意

    调用
    delete this
    后,将调用对象的析构函数,并释放动态分配的内存

    如果未使用
    new
    分配对象,则该对象将是
    未定义行为

    如果在
    删除此
    后访问了对象的任何数据成员或虚拟函数,则该行为将再次成为
    未定义行为


    <> P> >最好是避免<代码>删除< <代码> >。

    C++中的习惯用法是将清除代码放入析构函数中,然后在删除对象时自动调用它。
    Class::~Class() {
        do_cleanup();
    }
    
    void ManagingClass::deleteNode(Class* instance) {
        delete instance; //here the destructor gets called and memory gets freed
    }
    

    这实际上是一个常见的习惯用法,几乎和任何删除一样安全。作为 对于所有删除,您必须确保没有其他代码试图删除 访问该对象,您必须确保该对象 动态分配。然而,通常情况下,后者不是 问题是,因为习语只与具有 生命周期由对象的语义决定,这样的对象是 始终动态分配。找到所有的指针也很重要 对象可以是问题(是否使用了
    删除此
    );通常
    某种形式的观察者模式将用于通知所有感兴趣的人
    
    对象将不再存在。

    这样做是可以的,但正如您之前发现的那样,这样做并不一定安全。您无法再与对象交互。对于运行然后自行消亡的线程对象来说是有意义的。如果没有任何东西能提到他们,那也没关系。我很好奇。。为什么?打印指针etc根本无法访问底层内存。出于好奇,您为什么不在
    删除此项之后读取
    的值?在我看来,在任何情况下,这都是一个普通的删除,之后可以阅读(当然几乎没有用)。这是标准中明确禁止的,还是FAQ有点过于谨慎?“如果delete运算符的操作数是可修改的l值,则其值在对象被删除后是未定义的。”-仅仅因为它在FAQLite中并不意味着它是真的。提到的每一点同样适用于所有删除。
    删除此
    (事实上,在许多应用程序中,它将代表大多数删除操作)没有什么特别之处。@Jon根据标准,无效指针的任何左值到右值转换都是未定义的行为。删除对象会使指向该对象的所有指针无效。(这与
    删除此
    无关。它是系统性的。)这与
    删除此
    有何不同?我看不出
    auto_ptr
    如何归结为除了
    删除此
    之外的任何东西,因此与普通实现相比没有任何优势。我错了吗?这不能回答问题。糟糕。这只会增加混淆。@larsm,我刚刚做了一次编辑,应该会让这一点更清楚-区别在于,
    delete
    不会发生,直到你离开对象的范围。@Nawaz,它确实有点间接地回答了这个问题。如果你可以选择两种技术来做同样的事情,一种是保证安全的,另一种是不安全的,你应该选择安全的。这完全是错误的。或者更确切地说,它适用于
    delete
    的所有用法。
    删除此
    没有什么特别之处。这与问题有什么关系?清理c