如果我从 C++ 中的嵌套 map/set 中删除一个元素,是否会出现内存泄漏?

Will there be any memory leaks if I erase an element from a nested map/set in C++?

我正在尝试从 unordered_map<int, unordered_set<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本身呢?是否还停留在记忆中?

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

参见 std::unordered_map::erase 上的 documentation

This effectively reduces the container size by the number of elements removed, calling each element's destructor.

不,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():

References and iterators to the erased elements are invalidated. Other iterators and references are not invalidated.