【问题标题】:How to properly delete a map of pointers as key?如何正确删除指针映射作为键?
【发布时间】:2015-07-14 16:03:26
【问题描述】:

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

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

【问题讨论】:

  • 释放所有键后你打算如何处理地图?
  • 把所有的key都删掉,map有什么用?
  • 在修改密钥之前,您必须从 map 中删除元素(否则您有 UB)。
  • 我不知道你在试图做什么,但是当你开始尝试就地修改标准地图的钥匙时,汽车就翻车了悬崖。
  • std::map&lt;std::unique_ptr&lt;A&gt;, B*&gt; 似乎更合适。

标签: c++ pointers dictionary delete-operator


【解决方案1】:

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

如果您已经拥有密钥:

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;
    }
}

【讨论】:

    【解决方案2】:

    erase() 从映射中删除元素,然后删除作为键的指针(如果需要,在擦除之前缓存指针,如果它不存在于其他任何地方)

    每个唯一键只能出现一次映射。即使有可能——如果你想 nullptr 出多个元素的键会发生什么?没什么用!

    【讨论】:

      【解决方案3】:

      关键是常量。您应该无法更改它。 http://www.cplusplus.com/reference/map/map/

      【讨论】:

      • 所以我应该做delete itr-&gt;first?
      • 这将使密钥无用。将数据复制或移动到您想要的位置,然后删除整个条目。
      猜你喜欢
      • 2014-09-22
      • 2014-09-27
      • 2011-09-26
      • 2019-03-14
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多