Mik*_*ike 28 c++ pointers destructor stl
我有一张地图宣称为
std::map<std::string, Texture*> textureMap;
Run Code Online (Sandbox Code Playgroud)
我用它来将纹理文件的路径与实际纹理配对,这样我就可以通过路径引用纹理,而不会为单个精灵加载相同的纹理.我不知道该怎么做才能正确销毁ResourceManager类(地图所在的)的析构函数中的纹理.
我想过使用像这样的迭代器的循环:
ResourceManager::~ResourceManager()
{
for(std::map<std::string, Texture*>::iterator itr = textureMap.begin(); itr != textureMap.end(); itr++)
{
delete (*itr);
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,它说删除预期指针.现在已经很晚了,所以我可能只是错过了一些明显的东西,但我想让它在睡前工作.所以我是关闭还是我完全朝着错误的方向?
Rog*_*and 42
就示例代码而言,您需要在循环内执行此操作:
delete itr->second;
Run Code Online (Sandbox Code Playgroud)
地图有两个元素,您需要删除第二个元素.在你的情况下,itr->first是一个std::string,itr->second是一个Texture*.
如果您需要删除特定条目,可以执行以下操作:
std::map<std::string, Texture*>::iterator itr = textureMap.find("some/path.png");
if (itr != textureMap.end())
{
// found it - delete it
delete itr->second;
textureMap.erase(itr);
}
Run Code Online (Sandbox Code Playgroud)
您必须确保该条目存在于地图中,否则您在尝试删除纹理指针时可能会出现异常.
另一种方法可能是使用std::shared_ptr而不是原始指针,然后您可以使用更简单的语法从地图中删除项目,并std::shared_ptr在适当时让处理删除基础对象.这样,您可以使用erase()键参数,如下所示:
// map using shared_ptr
std::map<std::string, std::shared_ptr<Texture>> textureMap;
// ... delete an entry ...
textureMap.erase("some/path.png");
Run Code Online (Sandbox Code Playgroud)
这将做两件事:
Texture*,则将删除该对象为了使用std::shared_ptr你需要最近的C++ 11编译器或Boost.
答案并没有完全解决循环问题。至少 Coverty (TM) 不允许擦除循环内的迭代器并仍然使用它来继续循环。无论如何,删除内存后,在地图上调用 clear() 应该完成剩下的工作:
ResourceManager::~ResourceManager()
{
for(std::map<std::string, Texture*>::iterator itr = textureMap.begin(); itr != textureMap.end(); itr++)
{
delete (itr->second);
}
textureMap.clear();
}
Run Code Online (Sandbox Code Playgroud)