これにより、マップに含まれるポインターが削除されますか [...]?
いいえ、提供したコードを考えると、マップのすべてのメンバーがリークします。
原則として、すべてnew
に一致するdelete
. マップには がありますがdelete
、その中の要素にはありません。
この問題に対する最も正しい解決策は、動的割り当てをまったく使用しないことです。MyType
可能であれば、sディレクトリを保存するだけです:
map<string, MyType>
...そして、それ自体を動的に割り当てる代わりにmap
、自動的に保存します:
map<string,MyType> my_map;
何らかの理由で自動ストレージ期間が不可能な場合は、動的割り当てにスマート ポインターを使用します。C++11 コンパイラの場合、 の要素にunique_ptr
(または、まれに、shared_ptr
または さえも) を使用します。weak_ptr
map
map<string, unique_ptr<MyType>> my_map;
(C++03 コンパイラの場合は、それに相当する Boost を使用します。) 次に、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());
C++11 では、これを次のようなラムダにすることができます。
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});