假设我的游戏中有一个怪物,可以让神风敢死队在玩家身上爆炸。让我们随机选择一个怪物的名字:爬行者。因此,Creeper
该类具有一个类似于以下内容的方法:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
这些事件未排队,将立即分派。这会导致该Creeper
对象在调用的内部某处被删除postEvent
。像这样:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
由于Creeper
对象在kamikaze
方法仍在运行时会被删除,因此在尝试访问时它将崩溃this->location()
。
一种解决方案是将事件排队到缓冲区中,然后再分派它们。这是C ++游戏中的常见解决方案吗?感觉有点像破解,但这可能只是因为我在具有不同内存管理实践的其他语言上的经验。
在C ++中,对于对象从其方法之一内部意外删除自身的问题,是否有更好的一般解决方案?
autorelease
Objective-C 中的实现,在该实现中,删除操作会持续到“稍稍”。