Допустим, в моей игре есть монстр, который может взорвать камикадзе на игрока. Давайте наугад выберем имя для этого монстра: Creeper. Итак, у 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, где удаления задерживаются до "чуть-чуть".