它当然适用于由调用者创建的对象new
以及当调用者Update
正确了解该行为时。但我会避免它。在你的情况下,所有权显然在世界,所以我会让世界删除它。该对象不会自行创建,我认为它也不应该自行删除。如果您在对象上调用函数“更新”,可能会非常令人惊讶,但是突然间,如果 World 没有自己做任何事情(除了将其从列表中删除 - 但在另一个框架中),该对象就不再存在了!代码调用对象上的更新不会注意到)。
对此的一些想法
- 将对象引用列表添加到 World。该列表中的每个对象都待删除。这是一种常用技术,在 wxWidgets 中用于已关闭但仍可能接收消息的顶级窗口。在空闲时间,当所有消息都处理完毕后,处理挂起列表,并删除对象。我相信 Qt 遵循类似的技术。
- 告诉全世界该对象要被删除。世界将得到适当的通知,并将处理任何需要完成的事情。像一个
deleteObject(Object&)
可能的东西。
shouldBeDeleted
如果对象希望被其所有者删除,则向每个对象添加一个返回 true 的函数。
我更喜欢选项 3。世界会调用更新。之后,它会查看是否应该删除该对象,并且可以这样做 - 或者如果它愿意,它会通过手动将该对象添加到待删除列表中来记住该事实。
当您无法确定何时以及何时不能访问对象的函数和数据时,这真是令人头疼。例如,在 wxWidgets 中有一个 wxThread 类,它可以在两种模式下运行。其中一种模式(称为“可分离”)是,如果它的主函数返回(并且应该释放线程资源),它会删除自己(以释放 wxThread 对象占用的内存)而不是等待线程的所有者对象来调用等待或加入函数。然而,这会导致严重的头痛。你永远不能在它上面调用任何函数,因为它可能在任何情况下都被终止,而且你不能用 new 来创建它。相当多的人告诉我,他们非常不喜欢它的这种行为。
引用计数对象的自我删除很臭,恕我直言。让我们比较一下:
// bitmap owns the data. Bitmap keeps a pointer to BitmapData, which
// is shared by multiple Bitmap instances.
class Bitmap {
~Bitmap() {
if(bmp->dec_refcount() == 0) {
// count drops to zero => remove
// ref-counted object.
delete bmp;
}
}
BitmapData *bmp;
};
class BitmapData {
int dec_refcount();
int inc_refcount();
};
将其与自删除引用对象进行比较:
class Bitmap {
~Bitmap() {
bmp->dec_refcount();
}
BitmapData *bmp;
};
class BitmapData {
int dec_refcount() {
int newCount = --count;
if(newCount == 0) {
delete this;
}
return newCount;
}
int inc_refcount();
};
我认为第一个更好,而且我相信设计良好的引用计数对象不会“删除它”,因为它增加了耦合:使用引用计数数据的类必须知道并记住数据将自身删除为减少引用计数的副作用。请注意“bmp”如何可能成为 ~Bitmap 的析构函数中的悬空指针。可以说,不这样做“删除这个”在这里要好得多。
回答类似问题“删除这个有什么用”