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)
Jar*_*Par 12
我想这里有两个问题
可以从成员方法中有效地调用它吗?
是.只要您对使用非常小心,这是合法的.
应该删除这个在成员方法中使用吗?
在非常具体的情况下,这是必要的.例如,某些类型的智能指针使用该delete this模式来终止指针.例子:CComPtr<>风格.
除了智能指针之外,应该避免它,除非你有充分的理由这样做.即便如此,我还是会仔细重新考虑我的情景,看看是否有办法绕过它.
是的,有一些情况很常见.
参考计数:
void release()
{
cnt--;
if (cnt == 0)
delete this;
}
Run Code Online (Sandbox Code Playgroud)
GUI编程.在某些框架中,当用户关闭窗口时,窗口通常会自行删除.
准备下来投票.
它应该:号
能否在技术上:是的
这是个好主意:绝对不会.
是否存在有用的情况:当然.如果你是C++ foo非常强大.但大多数人并不那么好.所以,只有拥有一个与您合作的团队能够进行体面的代码审查,才能做到这一点.
原因:
对象无法知道它已被动态分配(因此需要删除)或者是普通对象(因此不能删除),因此它如何决定应该删除的天气.因此,如果一个对象正在删除自己,那么在我看来,这个设计有一些严重的错误.
如果你有一个需要管理的对象,你应该编写一个seprate对象来进行管理(因此智能指针).让对象做它擅长的事情,然后将对象的管理分解为另一个对象.
| 归档时间: |
|
| 查看次数: |
1983 次 |
| 最近记录: |