如何正确删除指针映射作为键?

时间:2015-07-14 16:03:26

标签: c++ pointers dictionary delete-operator

我有一个键/值指针的映射:

std::map<A*, B*> myMap;

只有解放密钥记忆的正确方法是什么?

我在考虑这样做:

for (auto itr = _myMap.begin(); itr != _myMap.end(); itr++)
{
    if (certainCondition == true)
    {
        delete itr->first;
        itr->first = nullptr;
    }
}

这是正确的做法吗?我的地图会将nullptr作为关键字,将来的迭代会包含nullptr吗?

2 个答案:

答案 0 :(得分:3)

您无法修改容器的键,因为它用于定义顺序,并且在适当的位置更改它可能会使排序无效。此外,每个密钥都必须是唯一的。因此,您需要从地图中删除该项目,然后清理内存。

如果您已有钥匙:

myMap.erase(key);
delete key;

如果你在地图中已经有一个迭代器:

A* keyCopy = itr->first;
myMap.erase(itr);
delete keyCopy;

修改

根据您更新的问题:

auto itr = myMap.begin();
while (itr != myMap.end())
{
    if (certainCondition == true)
    {
        A* keyCopy = itr->first;
        itr = myMap.erase(itr);
        delete keyCopy;
    }
    else
    {
        ++itr;
    }
}

答案 1 :(得分:1)

擦除()地图中的元素,然后删除充当键的指针(如果需要,在擦除之前缓存指针,如果它在其他地方不存在)

地图每个唯一键只能出现一次。即使它是可能的 - 如果你想将多个元素的键排除掉,会发生什么?没什么用的!