可能性の重複:
Does std::list::remove method call destructor of each removed element?は正しく他の場所に割り当てられたのstd ::リスト内のポインタを削除
は、私は、ユーザーが描画用の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;
}
}
私は "mが持つ問題は、最初のポインタが削除された後、次のイテレータは(メモリ位置が0xfeeefeeeです)、すでに解放されたオブジェクトを指していることである。
私が正しく、それぞれ1?
を削除、それらを反復処理する方法を
スマートポインタを使用してください! :) – GManNickG
'std :: binary_search'を呼び出すと、リンクリストの' O(log(n)) 'パフォーマンスが得られません。' O(log(n)) 'の比較が行われます。リストはランダムアクセスイテレータをサポートしていないので、O(n)オペレーションをすべて実行します。おそらくあなたはこれを既に知っているかもしれませんが、もしあなたがそうしないと言ったら... :) –
ブーストを使用している場合は、ブーストポインタコンテナ(boost :: ptr_listなど)を使用することもできます。それらは指し示されたオブジェクトの所有権を取り、それらを自動的に削除します。 (http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html) – Ferruccio