在Unorderd地图中删除指针
Deleting pointers in an unorderd map
我正在AI中试图在用于A*搜索的Unoredred Map中清洁内存,下面的代码是我为其中一个地图所做的。我无法正常工作,我需要一些帮助。
for (std::unordered_map<Tile*, PlannerNode*>::iterator itr = plan_map.begin(); itr != plan_map.end(); ++itr)
{
delete itr;
itr->second = nullptr;
}
由于您有一个指针的unordered_map
,因此您需要释放它们指向的空间,即在它们上调用delete
。之后,您想从地图上删除它们,而不是将它们设置为nullptr
。下面的示例可能会帮助您。它将打印
Destroying Tile
Destroying PlannerNode
在屏幕上。
#include <iostream>
#include <unordered_map>
struct Tile {
~Tile() { std::cout << "Destroying Tilen"; }
};
struct PlannerNode {
~PlannerNode() { std::cout << "Destroying PlannerNoden"; }
};
int main()
{
std::unordered_map<Tile*, PlannerNode*> plan_map;
plan_map.emplace(new Tile, new PlannerNode);
for (auto itr = plan_map.begin(); itr != plan_map.end(); /* no increment here! */)
{
delete itr->first;
delete itr->second;
itr = plan_map.erase(itr);
}
}
最好使用RAII构造来管理指针,例如std::unique_ptr
。这样,您就可以让plan_map
脱离范围,并为您自动清理所有内存。
std::unordered_map<std::unique_ptr<Tile>, std::unique_ptr<PlannerNode>> plan_map;
plan_map.emplace(std::make_unique<Tile>(), std::make_unique<PlannerNode>());
std::for_each(plan_map.begin(), plan_map.end(), [](auto& p){delete p.first; delete p.second;});
plan_map.clear();
这是一种更干净的方法,它还避免了笨拙的迭代器杂志。了解lambda语法不是问题的范围,我建议您查看C Lambda的理解。
确实研究了std::unique_ptr<>
,这将帮助您,您所需要做的一切将是 plan_map.clear()
;
参考:http://en.cppreference.com/w/cpp/algorithm/for_each
相关文章:
- 无法删除指针,已触发断点
- 删除指针数组 (C++) 中的元素
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 删除指针后内存泄漏
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- C++ 从 2 组指针中删除指针
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 在这种情况下,删除指针数组期间会发生什么?
- 在C++中删除指针数组时析构函数崩溃
- 何时/如何在使用指针后正确删除指针?
- 在C++库中,谁应该删除指针、用户或库?
- 删除指针后阻止对象使用 "this"
- 删除指针后C++尝试/捕获
- 删除指针内存分配以避免内存泄漏
- 删除指针时,未分配被释放的 C++ 指针错误
- 如何从抽象类中删除指针
- 我应该在 v8::外部手动删除指针吗?
- 删除指针
- C 如何删除指针的默认对象成员