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

标签 c++ pointers dictionary delete-operator

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

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

仅释放 key 内存的正确方法是什么?

我正在考虑这样做:

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

这是正确的做法吗?我的 map 是否会将 nullptr 保留为键并且 future 的迭代将包含 nullptr

最佳答案

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

如果您已经有 key :

myMap.erase(key);
delete key;

如果 map 中已有迭代器:

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

关于c++ - 如何正确删除指针映射作为键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411758/

相关文章:

python - 构造一个可以映射或解压缩的对象

c++ - 设置 -fno-elide-constructors 时,clang Xcode 4.4.1 是否存在错误?

c++ - qsort 与 std::sort 的性能?

c - 某些函数中修改的结构会更改指针并导致 free() 失败

c - 是否有任何平台指向不同类型的指针具有不同的大小?

emacs - 哪里可以找到ispell的法语词典?

c++ - 预处理器宏的问题

c++ - Visual Studio 2015中的C++调试器可执行文件在哪里?

c - 指向不返回字符串的结构的指针

Python嵌套循环迭代列表中的列表