Powiedzmy, że moja gra ma potwora, który może eksplodować kamikadze na odtwarzaczu. Wybierzmy losowo nazwę tego potwora: Pnącze. Tak więcCreeper
klasa ma metodę, która wygląda mniej więcej tak:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Zdarzenia nie są w kolejce, są wysyłane natychmiast. Powoduje to, że Creeper
obiekt zostaje usunięty gdzieś w wywołaniupostEvent
. Coś takiego:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Ponieważ Creeper
obiekt zostanie usunięty, gdy kamikaze
metoda jest nadal uruchomiona, zawiesi się podczas próby uzyskania dostępu this->location()
.
Jednym z rozwiązań jest umieszczenie zdarzeń w kolejce w buforze i wysłanie ich później. Czy to jest powszechne rozwiązanie w grach C ++? To trochę hack, ale może to wynikać z mojego doświadczenia z innymi językami z różnymi praktykami zarządzania pamięcią.
Czy w C ++ istnieje lepsze ogólne rozwiązanie tego problemu, w którym obiekt przypadkowo usuwa się z jednej ze swoich metod?
autorelease
w Objective-C, gdzie usuwanie jest wstrzymywane do „tylko trochę”.