Wird dies die in der Karte [...] enthaltenen Zeiger löschen?
Nein, angesichts des von Ihnen bereitgestellten Codes werden Sie jedes Mitglied der Karte verlieren.
In der Regel muss für jede new
ein passender delete
vorhanden sein. Sie haben eine delete
für die Karte, aber keine für die Elemente innerhalb.
Die korrekteste Lösung für dieses Problem ist, keine dynamische Zuordnung zu verwenden. Nur speichern MyType
s Verzeichnis, wenn möglich:
map<string, MyType>
... und statt dynamisch die map
Zuweisung selbst, zu speichern, die automatisch:
map<string,MyType> my_map;
Wenn die automatische Speicherdauer für einige nicht möglich ist, Grund, dann verwenden Sie einen intelligenten Zeiger für die dynamischen Zuordnungen. Bei einem Compiler 11 C++, verwendet unique_ptr
(oder selten oder gar shared_ptr
weak_ptr
) für die Elemente in den map
: (. Bei einem gegebenen C++ Kompilierer 03, verwenden, um den Boost-Äquivalente davon)
map<string, unique_ptr<MyType>> my_map;
Wenn dann my_map
zerstört wird, werden alle Elemente delete
d.
Baring dies alles, wenn Sie in einer Situation sind, wo keiner der oben für Sie arbeiten (ich würde durch höchst verdächtig), dann müssen Sie die Karte youself iterieren:
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 ++, könnte dies eine Lambda, etwas entlang der Linie gemacht werden:
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
Die später - 'map' (und die meisten (wenn nicht alle) Container in der Standardbibliothek?) Wurde entwickelt nicht jeder Zeiger enthält auf Zerstörung zu löschen. – Nbr44
Ok danke. Die Dokumentation, die ich gelesen habe, war nicht sehr klar. Es lautete: 'Dies reduziert die Containergröße effektiv um die Anzahl der entfernten Elemente, die zerstört werden. – Max
Das ist ein häufiges Missverständnis - die Zeiger selbst werden zwar zerstört, aber das ändert nicht den Zustand des Speicherorts, auf den sie zeigen . – Nbr44