删除无序映射中的指针

时间:2017-12-02 02:39:45

标签: c++ artificial-intelligence

我在AI试图清理一个用于A *搜索的无法恢复的地图中的内存,下面的代码就是我正在为我的一张地图做的事情。我无法让它发挥作用,我需要一些帮助。

   
    for (std::unordered_map<Tile*, PlannerNode*>::iterator itr = plan_map.begin(); itr != plan_map.end(); ++itr)
    {
        delete itr;
        itr->second = nullptr;
    }

2 个答案:

答案 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();

参考:http://en.cppreference.com/w/cpp/algorithm/for_each