Cas*_*sey 2 c++ iterator memory-management stdlist
我有一个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).
如何正确迭代它们,删除每一个?
如果你想要安全和隐式资源清理,不要使用原始指针,使用智能指针!
STL容器的问题是:
如果包含的对象是指针,STL容器不会取得破坏它的所有权.您必须在每个包含的指针上显式调用delete以删除它指向的内容.
在这里看看这个类似的问题.
去这个问题,最好的办法是不存储原始指针STL容器内,但使用他们的智能堂兄弟智能指针,而不是(boost::shared_ptr)退房Boost文档,这些指针表兄弟具备足够的智能来解除分配自己的时候没有一个提到他们,并保存你遇到的问题就像你现在面临的那样.
| 归档时间: |
|
| 查看次数: |
8119 次 |
| 最近记录: |