0

std::list と std::map を空にして、すべてのポインターで delete を呼び出したいと思います。

この質問を読んだ後、私はこれを std::list に使用しています:

mylist.remove_if([](myThingy* thingy) -> bool { delete thingy; return true; });

std::map にも同様に簡潔なものはありますか?

私のコンパイラ (VC10) でサポートされていないため、範囲ベースの for ループを使用できないことに注意してください。それが可能であれば、私は仮定します

for(auto* thingy : myMap) { delete thingy; }
myMap.clear();

動作します。間違っている場合は修正してください。

4

2 に答える 2

2

std::map にも同様に簡潔なものはありますか?

このようにすることができます(あなたthingyがキーではなくマップされた値であると仮定します):

for_each(myMap.begin(), myMap.end(), 
    [] (decltype(myMap)::value_type const& p) { delete p.second; });

myMap.clear();

範囲ベースのforループについて:

それが可能であれば、私は仮定します

for(auto* thingy : myMap) { delete thingy; }
myMap.clear();

動作します。間違っている場合は修正してください。

多かれ少なかれ。マップの値は実際にはペアであることを覚えておく必要がありますが、範囲ベースforを修正してそれを考慮に入れることができます。

for (auto&& p : myMap) { delete p.second; }
myMap.clear();

newいずれにせよ、生のポインター、、およびを介して手動でメモリ管理を実行する代わりに、スマート ポインターを使用することを検討してくださいdelete。こうすることで、この種の問題を回避できます。

于 2013-05-03T17:16:40.560 に答える