2017-05-29 1 views
1

unordered_map<int, unordered_set<int>>からunordered_set<int>を削除しようとしています。C++でネストされたマップ/セットから要素を削除するとメモリリークが発生しますか?

unordered_set<int>をunordered_mapから消去した後はどうなりますか?メモリに残っているので、メモリリークの原因になりますか?はいの場合、メモリから完全に削除するにはどうすればよいですか?

次のコードを試しました。

#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; 
} 

unordered_set自体についての出力は2で、0はunordered_setの要素が削除されているようだが、何?まだそれは記憶に残っていますか?

+4

あなたはそれを考えすぎています。標準的なコンテナがあなたのためにメモリを管理します。ここで間違っているのは、ぶら下がっている参照であり、その使用は未定義の動作です。 – DeiDei

答えて

1

いいえ、メモリに残りません。デストラクタが呼び出され、メモリが解放されます。この点に関して、unordered_setのオブジェクトは、STLコンテナに入れることができる他のオブジェクトと同じです。

std::unordered_map::erasedocumentationを参照してください:

これは事実上、各要素のデストラクタを呼び出して、取り除かれた要素の数によってコンテナのサイズを小さくします。

1

unordered_setのデストラクタが呼び出されるので(それはunordered_mapの値として使用される任意のオブジェクトで動作するように)いいえ、unordered_setがメモリから解放されます。ほとんどの場合、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()を呼び出すときに参照が無効にされています:

参考とイテレータを消去する

はまた、あなたは未定義の動作である、ここでダングリング参照を使用していることに注意してください要素は無効になります。その他 イテレータと参照は無効にされません。

関連する問題