Katakanlah gim saya memiliki monster yang dapat kamikaze meledak pada pemain. Mari kita pilih nama untuk monster ini secara acak: Creeper. Jadi, Creeper
kelas memiliki metode yang terlihat seperti ini:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Acara tidak antri, mereka dikirim segera. Ini menyebabkan Creeper
objek terhapus di suatu tempat di dalam panggilan postEvent
. Sesuatu seperti ini:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Karena Creeper
objek terhapus saat kamikaze
metode ini masih berjalan, itu akan macet ketika mencoba mengakses this->location()
.
Salah satu solusinya adalah dengan mengantri acara ke buffer dan mengirimkannya nanti. Apakah itu solusi umum dalam game C ++? Rasanya seperti sedikit peretasan, tapi itu mungkin hanya karena pengalaman saya dengan bahasa lain dengan praktik manajemen memori yang berbeda.
Dalam C ++, apakah ada solusi umum yang lebih baik untuk masalah ini di mana sebuah objek secara tidak sengaja menghapus dirinya sendiri dari dalam salah satu metodenya?
autorelease
di Objective-C, di mana penghapusan ditunda hingga "hanya sedikit".