내 게임에 플레이어를 폭발시킬 수있는 몬스터가 있다고 가정 해 봅시다. 이 괴물의 이름을 무작위로 선택합시다 : 크리퍼. 따라서 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 의 구현을 살펴보면 , "약간"까지 삭제가 보류됩니다.