sarà questo eliminare i puntatori contenuti nella mappa [...]?
No, dato il codice che hai fornito, perderai tutti i membri della mappa.
Di norma, per ogni new
è necessario corrispondere a delete
. Hai un delete
per la mappa, ma nessuno per gli elementi all'interno.
La soluzione più corretta a questo problema è di non utilizzare affatto l'allocazione dinamica. Basta memorizzare directory MyType
s, se possibile:
map<string, MyType>
... e invece di allocare dinamicamente la map
sé, negozio che automaticamente:
map<string,MyType> my_map;
Se la durata di memorizzazione automatica non è possibile per qualche motivo, quindi utilizzare un puntatore intelligente per le allocazioni dinamiche. Dato un C++ 11 compilatore, usare unique_ptr
(o, raramente, shared_ptr
o anche weak_ptr
) per gli elementi nel map
: (. Dato un compilatore C++ 03, utilizzare gli equivalenti Boost loro)
map<string, unique_ptr<MyType>> my_map;
Quindi, quando my_map
viene distrutto, tutti gli elementi saranno delete
d.
Baring tutto questo, se si è in una situazione in cui nessuna delle precedenti funziona per voi (lo farei da personale altamente sospetta), allora si avrà bisogno di iterare la mappa youself:
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
In C++ 11, questo potrebbe essere fatto un lambda, qualcosa lungo la linea del:
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
Il successivo - 'map' (e la maggior parte (se non tutti?) Dei contenitori nella libreria standard) non è stato progettato per eliminare qualsiasi puntatore che contiene in caso di distruzione. – Nbr44
Ok, grazie. La documentazione che ho letto su di esso non era molto chiara. Diceva: 'Questo riduce efficacemente le dimensioni del contenitore per il numero di elementi rimossi, che vengono distrutti. – Max
Questo è un malinteso comune: gli _pointers_ sono effettivamente distrutti, ma ciò non cambia lo stato della posizione di memoria a cui puntano . – Nbr44