これは[...]マップに含まれているポインタを削除しますか?
いいえ、指定したコードでは、マップのすべてのメンバーがリークします。
通常、new
ごとに一致するdelete
が必要です。マップにはdelete
がありますが、その中の要素はありません。
この問題の最も適切な解決策は、動的割り当てをまったく使用しないことです。可能な場合だけ、MyType
のディレクトリを格納します。
map<string, MyType>
...、代わりに動的にmap
自体を確保するので、自動的に店舗:
map<string,MyType> my_map;
を自動記憶域期間は、いくつかのために不可能な場合理由は、動的割り当てにスマートポインタを使用します。 C++コンパイラ11与えられ、map
の要素のためunique_ptr
(または、まれに、shared_ptr
あるいはweak_ptr
)を使用:
map<string, unique_ptr<MyType>> my_map;
(そのブースト等価物を使用し、C++コンパイラ03を考えます。)そして、my_map
が破壊されると、すべての要素はdelete
dになります。で
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
:あなたが上記のいずれもがあなたのために動作しません状況(私は非常に疑うことである)である場合
ベアリング・このすべて、あなたは、マップyouselfを反復処理する必要があります。 C++ 11、これはラムダ、の線に沿って何かを作ることができる:現代のC++では
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
'map'(および標準ライブラリの大部分(すべてではないにしても)の大部分のコンテナ)は、破壊時に含まれるポインタを削除するようには設計されていません。 – Nbr44
ありがとう。私が読んだドキュメントはあまり明確ではありませんでした。 'これは、削除された要素の数だけコンテナサイズを効果的に減らします。それは破壊されます。 ' – Max
これは一般的な誤解です - _pointers_自体は実際には破壊されますが、それらが指し示すメモリ位置の状態は変わりません。 – Nbr44