如果我从C ++中的嵌套映射/集中擦除元素,是否会有任何内存泄漏?

时间:2017-05-29 15:44:02

标签: c++ memory-leaks unordered-map unordered-set

我正在尝试从unordered_set<int>删除unordered_map<int, unordered_set<int>>

我从unordered_map中删除unordered_set<int>后会发生什么?它还会留在内存中,从而导致内存泄漏吗?如果是,我应该怎么做才能将其从记忆中完全删除?

我尝试了以下代码。

#include <iostream>
#include <unordered_map>
#include <unordered_set>

using namespace std;

unordered_map<int, unordered_set<int>> mp;

int main()
{
    mp[0] = unordered_set<int>();
    mp[0].insert(1);
    mp[0].insert(2);

    unordered_set<int>& st = mp[0];
    cout << st.size() << endl;
    mp.erase(0);
    cout << st.size() << endl;

    return 0;
}

输出为2和0.似乎unordered_set中的元素已被删除,但是unordered_set本身呢?它还留在记忆中吗?

2 个答案:

答案 0 :(得分:1)

不,它不会留在记忆中。将调用析构函数并释放内存。在这方面,unordered_set对象与您可能想要放入STL容器中的任何其他对象没有区别。

请参阅std::unordered_map::erase上的documentation

  

这有效地减少了容器大小,删除了元素的数量,调用每个元素的析构函数。

答案 1 :(得分:1)

不,unordered_set将从内存中释放,因为unordered_set的析构函数将被调用(因为它适用于unordered_map中用作值的任何对象)。在大多数情况下,您可以信任STL容器为您进行内存管理。

另请注意,您在此处使用悬空引用,这是未定义的行为:

unordered_set<int>& st = mp[0];
cout << st.size() << endl;
mp.erase(0);
cout << st.size() << endl;  // <-- calling size() on a dangling reference

调用unordered_map::erase()时参考号已失效:

  

擦除元素的引用和迭代器无效。其他   迭代器和引用不会失效。