应该从成员方法中调用"删除此"吗?

jld*_*ont 20 c++ self-destruction

我刚刚阅读这篇文章,并希望得到大家的建议:

问:应该delete this;从成员方法中调用吗?

dma*_*oni 33

通常这是一个坏主意,但它偶尔会有用.

只要在删除后不使用任何成员变量,它就是完全安全的,只要调用此方法的客户端理解它就可以删除该对象.

这个有用的一个很好的例子是你的类使用引用计数:

void Ref() {
  m_References++;
}

void Deref() {
  m_References--;
  if (m_References == 0) {
    delete this;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 你把它拼好了,Elcuco.你想说什么?你是否担心破坏自身的物体会产生比其他物质破坏物体更多的悬垂指针?`foo-> Deref()`并不比`if(foo-> Deref()== 0)删除foo;`.此外,如果引用计数为零,则无论如何都没有任何其他指针悬空. (16认同)

Jar*_*Par 12

我想这里有两个问题

可以从成员方法中有效地调用它吗?

是.只要您对使用非常小心,这是合法的.

应该删除这个在成员方法中使用吗?

在非常具体的情况下,这是必要的.例如,某些类型的智能指针使用该delete this模式来终止指针.例子:CComPtr<>风格.

除了智能指针之外,应该避免它,除非你有充分的理由这样做.即便如此,我还是会仔细重新考虑我的情景,看看是否有办法绕过它.


Liz*_*bin 11

是的,你可以,这里是一个很好的解释时间和原因


Rol*_*ien 5

是的,有一些情况很常见.

参考计数:

void release() 
{
  cnt--;
  if (cnt == 0) 
    delete this;
}
Run Code Online (Sandbox Code Playgroud)

GUI编程.在某些框架中,当用户关闭窗口时,窗口通常会自行删除.


Mar*_*ork 5

准备下来投票.

它应该:号
能否在技术上:是的
这是个好主意:绝对不会.
是否存在有用的情况:当然.如果你是C++ foo非常强大.但大多数人并不那么好.所以,只有拥有一个与您合作的团队能够进行体面的代码审查,才能做到这一点.

原因:
对象无法知道它已被动态分配(因此需要删除)或者是普通对象(因此不能删除),因此它如何决定应该删除的天气.因此,如果一个对象正在删除自己,那么在我看来,这个设计有一些严重的错误.

如果你有一个需要管理的对象,你应该编写一个seprate对象来进行管理(因此智能指针).让对象做它擅长的事情,然后将对象的管理分解为另一个对象.