我正在尝试从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本身呢?它还留在记忆中吗?
答案 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()
时参考号已失效:
擦除元素的引用和迭代器无效。其他 迭代器和引用不会失效。