这个问题已经在这里有了答案:
已关闭8年。
我有一个SpriteHandler类,该类允许用户注册一个指向Sprite对象以进行绘制的指针,它所做的只是对对象的访问方法。我想编写一个安全锁,如果用户在程序结束时忘记这样做,则会自动删除与指针关联的内存(这也不必为用户担心!):
//SpriteHandler.hclass SpriteHandler {public://... void RegisterObject(Sprite* object); bool IsRegistered(Sprite* object); void UnregisterObject(Sprite* object);private://... static std::list<Sprite*>* _sprite = NULL;};//SpriteHandler.cppstd::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)。
我如何正确遍历它们,删除每个?
最佳答案
如果要安全和隐式资源清除,请不要使用原始指针,而要使用智能指针!
STL容器的问题是:
如果包含的对象是指针,则STL容器请勿拥有销毁它的所有权。
您将必须在每个包含的指针上显式调用delete来删除其指向的内容。
看看这个类似的问题 here 。
做到这一点的最佳方法不是在STL容器中存储原始指针,而是使用它们的智能表兄弟智能指针(boost::shared_ptr
)来检查Boost documentation,这些指针表兄弟足够聪明,可以在没有人引用它们并释放它们时进行分配您遇到的问题就像您现在面临的那样。
关于c++ - 正确删除分配在其他位置的std::list中的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6722179/