代码之家  ›  专栏  ›  技术社区  ›  Cristián Romo

“删除这个”安全吗?[副本]

  •  33
  • Cristián Romo  · 技术社区  · 16 年前

    this 后来在一个函数中 delete s 可能是运行时错误。这是真的吗?通常安全吗 delete this ? 还是只有某些情况是安全的?

    10 回复  |  直到 9 年前
        1
  •  46
  •   Chris Peterson    16 年前

    delete this 是合法的,并且执行您所期望的操作:它调用类的析构函数并释放底层内存。之后 删除这个 返回,您的 this 指针值不起作用 改变,所以它现在是一个悬而未决的指针,应该 被取消引用。这包括使用类的成员变量进行隐式解引用。

    通常在引用计数的类中发现,当ref计数减为0时 DecrementRefCount() / Release() /无论成员函数调用什么 删除这个 .

    删除这个 由于许多原因,它通常被认为是非常糟糕的形式。之后很容易意外访问成员变量 . 调用方代码可能未意识到对象已自毁。

    删除这个 是一种“代码气味”,您的代码可能没有对象所有权的对称策略(谁分配谁删除)。 new ,这么说 删除这个 表示类A正在分配对象,但类B稍后将释放它[自身]。

        2
  •  16
  •   JaredPar    16 年前

    唯一的危险是在调用“delete this”后试图访问任何其他成员数据。这当然是不安全的。

        3
  •  14
  •   al pacino al pacino    16 年前

        4
  •  13
  •   1800 INFORMATION    16 年前

    删除此项是完全合法的,正如其他人已经提到的。这是有风险的,还有一个原因尚未提及——您假设对象已在堆上分配。这可能很难保证,尽管在引用计数实现的情况下通常不是问题。

        5
  •  6
  •   Bruce Ikin    16 年前

    正如其他人所说,delete这是一个有效的习惯用法,但为了安全起见,您必须确保对象从未在堆栈上实例化。

        6
  •  3
  •   Steve Rowe    16 年前

    对应该很好。“This”只是一个指针。任何指针都可以删除。有关如何删除对象的信息包含在堆记录中。这就是IUnknown::Release()通常在COM对象中实现的方式。

        7
  •  3
  •   rptony    16 年前

    删除当您有要删除的对象的子类时,这可能会导致问题。请记住,构造从上到下开始,删除从下到上开始。因此,如果删除这是在层次结构的中间,则基本上失去了这个特定类下面的所有对象。

    删除当您实现引用计数对象时,这非常方便,COM类就是一个例子。

        8
  •  2
  •   Community CDub    7 年前

    Read 进行类似的讨论。您的理解是正确的,因为它确实有效,是需要的,并且可能是危险的,因为您以后无法访问它。

        9
  •  2
  •   Loki Astari    16 年前

    法律上是的
    安全号

        10
  •  -2
  •   rptwsthi    9 年前

    class Base
    {
    
        virtual void Release()
        {
            delete this;
        }
    
    }
    
    class Derived : public Base
    {
    
        void Foo()
        {
            ...
        }
    
    }
    
    main()
    {
    
        Base *ptrDerived = new Derived();
        ptrDerived->release();
        ptrDerived->Foo() //Crash
    
    }
    
    推荐文章