在Unorderd地图中删除指针

Deleting pointers in an unorderd map

本文关键字:删除 指针 地图 Unorderd      更新时间:2023-10-16

我正在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