ユーザーが描画用の Sprite オブジェクトへのポインターを登録できるようにする SpriteHandler クラスがあります。オブジェクトのメソッドにアクセスするだけです。ユーザーがプログラムの最後までに削除するのを忘れた場合に、ポインタに関連付けられたメモリを自動的に削除する安全キャッチを書きたかった (そして、ユーザーにとっても心配する必要はありません!):
//SpriteHandler.h
class SpriteHandler {
public:
//...
void RegisterObject(Sprite* object);
bool IsRegistered(Sprite* object);
void UnregisterObject(Sprite* object);
private:
//...
static std::list<Sprite*>* _sprite = NULL;
};
//SpriteHandler.cpp
std::list<Sprite*>* SpriteHandler::_sprites = NULL;
void SpriteHandler::RegisterObject(Sprite* object) {
if(object == NULL) return;
if(_sprites == NULL) _sprites = new std::list<Sprite*>();
_sprites->push_back(object);
_sprites->sort(UDLessSprite);
}
bool SpriteHandler::IsRegistered(Sprite* object) {
return std::binary_search(_sprites->begin(), _sprites->end(), object);
}
void SpriteHandler::UnregisterObject(Sprite* object) {
if(object == NULL) return;
if(IsRegistered(object) == false) return;
_sprites->remove(object);
if(_sprites->size() <= 0) {
if(_sprites) {
_sprites->clear();
delete _sprites;
_sprites = NULL;
}
return;
}
_sprites->sort(UDLessSprite);
}
void SpriteHandler::Release() {
if(_sprites) {
std::list<Sprite*>::iterator _iter = _sprites->begin();
while(_iter != _sprites->end()) {
delete (*_iter);
(*_iter) = NULL;
++_iter;
}
_sprites->clear();
delete _sprites;
_sprites = NULL;
}
}
私が抱えている問題は、最初のポインターが削除された後、次の反復子が既に解放されたオブジェクトを指していることです (メモリの場所は 0xfeeefeee です)。
それらを正しく反復処理して、それぞれを削除するにはどうすればよいですか?