2017-05-29 61 views
1

我試圖從unordered_map<int, unordered_set<int>>中刪除unordered_set<int>如果我從C++嵌套的map/set中刪除一個元素,會不會有任何內存泄漏?

在將它從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本身?它仍然留在記憶中嗎?

+4

你在推翻它。標準容器爲您保管內存。這裏唯一錯誤的是懸掛參考,它的使用是未定義的行爲。 – DeiDei

回答

1

不,它不會留在內存中。析構函數將被調用並且內存將被釋放。在這方面,unordered_set對象與您希望放入STL容器的任何其他對象沒有區別。

documentationstd::unordered_map::erase

這有效地減少通過去除元件的數量的容器的大小,調用每個元件的析構函數。

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()時,參考已失效元素無效。其他 迭代器和引用不會失效。