私のゲームには、プレイヤーで神風が爆発するモンスターがいるとしましょう。このモンスターの名前をランダムに選んでみましょう:クリーパー。そのため、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()
。
1つの解決策は、イベントをバッファにキューイングし、後でそれらをディスパッチすることです。それはC ++ゲームの一般的なソリューションですか?それはちょっとしたハックのように感じますが、それは異なるメモリ管理プラクティスを持つ他の言語での私の経験のためかもしれません。
C ++では、オブジェクトがそのメソッドの1つから誤って自分自身を削除するこの問題に対するより一般的な解決策はありますか?
autorelease
、Objective-Cのは、「ほんの少し」まで削除が保留されます。