Diyelim ki oyunumun kamikaze üzerinde oyuncu patlayabilir bir canavar var. Bu canavar için rastgele bir isim seçelim: bir Creeper. Yani, Creeper
sınıfın şuna benzer bir yöntemi vardır:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Olaylar sıraya alınmaz, hemen gönderilir. Bu, Creeper
nesnenin çağrının içinde bir yerde silinmesine neden olur postEvent
. Bunun gibi bir şey:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Çünkü Creeper
ise nesne silinir kamikaze
yöntemi hala çalışıyorsa o erişmeye çalıştığında, bu çökmesine olacak this->location()
.
Bir çözüm, olayları bir arabellekte sıralamak ve daha sonra göndermektir. Bu C ++ oyunlarında ortak çözüm mü? Biraz hack gibi geliyor, ancak bunun nedeni sadece farklı bellek yönetimi uygulamalarına sahip diğer dillerle yaşadığım deneyim olabilir.
C ++ 'da, bir nesnenin kendi yöntemlerinden birinin içinden yanlışlıkla sildiği bu soruna daha iyi bir genel çözüm var mı?
autorelease
silme işlemlerinin "biraz" yapılmasına kadar devam ettiği Objective-C uygulamasına da göz atabilirsiniz .