它对使用“new”创建的对象有效,并且在“Update”的调用者正确了解该行为时。但我会避免这种情况。在你的情况下,拥有权明显在于世界,所以我会让世界删除它。对象不是自己创建的,我认为它也不应该自己删除。如果您调用对象上的函数“Update”,但突然之间对象不存在而没有任何世界做出的操作(除了将其从列表中删除 - 但是在另一个帧!调用对象上的Update代码将注意不到这一点)可能会非常令人惊讶。
关于此问题的一些想法:
1. 添加一个对象引用列表到世界中。列表中的每个对象都等待删除。这是一种常见技术,在wxWidgets中用于已关闭但仍可能接收消息的顶级窗口。在空闲时间内,当处理完所有消息后,将处理待处理列表并删除对象。我相信Qt遵循类似的技术。
2. 告诉世界对象想要被删除。世界将被适当地告知并将照顾需要完成的任何事情。例如,像“deleteObject(Object&)”这样的东西。
3. 为每个对象添加一个“shouldBeDeleted”函数,如果对象希望被其所有者删除,则返回true。
我更喜欢选项3。世界将调用Update。之后,它会查看对象是否应该被删除,并可以这样做 - 或者如果它希望,它通过手动将该对象添加到待删除列表中来记住该事实。
当您无法确定何时何时不可以访问对象的函数和数据时,这真是一件痛苦的事情。例如,在wxWidgets中,有一个wxThread类,它可以在两种模式下操作之一(称为“可分离”)。其中之一是,如果其主要功能返回(并且线程资源应该被释放),它将删除自身(以释放wxThread对象占用的内存),而不是等待线程对象的所有者调用wait或join函数。然而,这会引起严重的头痛。您永远不可以调用任何要素,因为它可能已经在任何情况下终止,并且您不能使用new创建它。相当多的人告诉过我,他们非常不喜欢它的行为。
在我看来,引用计数对象的自我删除有点臭味相似。让我们比较一下:
class Bitmap {
~Bitmap() {
if(bmp->dec_refcount() == 0) {
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();
};
我认为第一种方式更好,我相信设计良好的引用计数对象不会使用"delete this",因为这会增加耦合性:使用引用计数数据的类必须知道并记住数据在减少引用计数的副作用下删除自身。请注意,在~Bitmap的析构函数中,"bmp"可能成为一个悬空指针。可以说,在这里不执行"delete this"更好。
回答类似问题"delete this有什么作用"的问题"What is the use of delete this"