正确删除其他地方分配的std :: list中的指针

Cas*_*sey 2 c++ iterator memory-management stdlist

可能重复:
std :: list :: remove方法是否调用每个被删除元素的析构函数?

我有一个SpriteHandler类,允许用户注册指向Sprite对象的指针以进行绘制,它所做的就是访问对象上的方法.我想编写一个安全捕获程序,如果用户在程序结束时忘记这样做,则会自动删除与指针关联的内存(而且对用户来说也不用担心!):

 

//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).

如何正确迭代它们,删除每一个?

Alo*_*ave 7

如果你想要安全和隐式资源清理,不要使用原始指针,使用智能指针!

STL容器的问题是:
如果包含的对象是指针,STL容器不会取得破坏它的所有权.您必须在每个包含的指针上显式调用delete以删除它指向的内容.

这里看看这个类似的问题.

去这个问题,最好的办法是不存储原始指针STL容器内,但使用他们的智能堂兄弟智能指针,而不是(boost::shared_ptr)退房Boost文档,这些指针表兄弟具备足够的智能来解除分配自己的时候没有一个提到他们,并保存你遇到的问题就像你现在面临的那样.

  • 我看到很多人建议使用boost智能指针,这完全是一件好事,尽管智能指针可以在C++标准库TR1中获得,这些数据库目前由大多数编译器实现/支持; 有关boost,TR1和C++ 0x之间的比较,请参阅http://www.codesynthesis.com/~boris/blog/2010/05/24/smart-pointers-in-boost-tr1-cxx-x0/ http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361为TR1智能指针设施提供了一个很好的动手介绍(我相信有更多的文章,Pete Becker的文章来自例如,DDJ浮现在脑海中. (2认同)