我在AI试图清理一个用于A *搜索的无法恢复的地图中的内存,下面的代码就是我正在为我的一张地图做的事情。我无法让它发挥作用,我需要一些帮助。
for (std::unordered_map<Tile*, PlannerNode*>::iterator itr = plan_map.begin(); itr != plan_map.end(); ++itr)
{
delete itr;
itr->second = nullptr;
}
答案 0 :(得分:0)
由于你有一个unordered_map
指针,你需要释放它们所指向的空间,即在它们上面调用delete
。之后,您希望erase来自地图,而不是将其设置为nullptr
。以下示例可能对您有所帮助。它会打印
Destroying Tile
Destroying PlannerNode
在屏幕上。
#include <iostream>
#include <unordered_map>
struct Tile {
~Tile() { std::cout << "Destroying Tile\n"; }
};
struct PlannerNode {
~PlannerNode() { std::cout << "Destroying PlannerNode\n"; }
};
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>());
答案 1 :(得分:0)
std::for_each(plan_map.begin(), plan_map.end(), [](auto& p){delete p.first; delete p.second;});
plan_map.clear();
这是一个更清洁的方法,它也避免了笨拙的迭代器aritematic。 理解lambda语法不在问题的范围内,我建议查找C ++ lambda来理解这一点。
请查看std::unique_ptr<>
,这将有助于您和您需要做的所有事情,
plan_map.clear()
;