สมมติว่าเกมของฉันมีสัตว์ประหลาดที่สามารถโจมตีได้ด้วยระเบิด เรามาเลือกชื่อสัตว์ประหลาดตัวนี้แบบสุ่ม: 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 ซึ่งการลบจะถูกระงับไว้สำหรับ "เพียงเล็กน้อย"