【问题标题】:Remove element from unordered_map without calling destructor on it从 unordered_map 中删除元素而不调用析构函数
【发布时间】:2016-09-21 00:57:51
【问题描述】:

我想从 STDL 无序映射中删除一个元素,而不对该元素调用析构函数。例如,假设我有以下内容:

std::unordered_map<size_t, my_obj*> map;

my_obj *ptr = new my_obj();
map[5] = ptr;

map.erase(5); // This calls a destructor on ptr.

有没有办法让我从地图中删除条目5 -&gt; ptr,而不调用我要删除的元素的析构函数?

【问题讨论】:

  • 为什么这被否决了?
  • 反正不会在那个 scnario 中调用析构函数。
  • 你有一个指针。不会调用析构函数。您误解了文档。
  • 指针没有析构函数。您的地图包含指针。如果它包含对象,则将调用它们的析构函数。但是您的地图不包含对象。它包含指针。
  • 更准确的说,被擦除的会被销毁,但是被擦除的是指针,所以被销毁的只是指针本身,而不是指针指向的地方。

标签: c++ stl unordered-map


【解决方案1】:

首先通过以下方式获取std::pair形式的键值对:

std::unordered_map<int,my_obj*>::iterator Itr= map.find(5);

然后删除Itr的值部分,它实际上包含my_obj的指针,如下所示,以避免内存泄漏:

if(Itr not_eq map.end()) 
{
     delete Itr->second;
     Itr->second = nullptr;
     objects.erase(Itr);
}

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 2014-05-27
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2018-10-29
    • 2012-03-13
    • 2013-09-30
    相关资源
    最近更新 更多