Cela supprimera-t-il les pointeurs contenus dans la carte [...] ?
Non, étant donné le code que vous avez fourni, vous ferez fuir tous les membres de la carte.
En règle générale, pour chaque new
il doit y avoir une correspondance delete
. Vous avez un delete
pour la carte, mais aucune pour les éléments qu'elle contient.
La solution la plus correcte à ce problème est de ne pas utiliser l'allocation dynamique. Il suffit de stocker MyType
si possible :
map<string, MyType>
... et au lieu d'allouer dynamiquement le fichier map
lui-même, le stocke automatiquement :
map<string,MyType> my_map;
Si la durée de stockage automatique n'est pas possible pour une raison quelconque, utilisez un pointeur intelligent pour les allocations dynamiques. Avec un compilateur C++11, utilisez unique_ptr
(ou, rarement, shared_ptr
ou même weak_ptr
) pour les éléments de la map
:
map<string, unique_ptr<MyType>> my_map;
(Si l'on dispose d'un compilateur C++03, il faut utiliser les équivalents Boost). my_map
est détruit, tous les éléments seront delete
d.
En dépit de tout cela, si vous vous trouvez dans une situation où aucune des solutions ci-dessus ne fonctionne pour vous (ce que je soupçonne fortement), vous devrez itérer la carte vous-même :
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
En C++11, on pourrait en faire un lambda, quelque chose du genre :
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});