如果我从 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.
我正在尝试从 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.