Spowoduje to usunięcie wskazówek zawartych w mapie [...]?
Nie, z uwagi na podany kod, wycieknie każdy członek mapy.
Z reguły dla każdego new
musi być pasujący delete
. Masz delete
dla mapy, ale żadna dla elementów wewnątrz.
Najbardziej poprawnym rozwiązaniem tego problemu jest niestosowanie alokacji dynamicznej. Wystarczy przechowywać MyType
s katalogu, jeśli to możliwe:
map<string, MyType>
... i zamiast dynamicznego przydzielania samego map
, sklep, który automatycznie:
map<string,MyType> my_map;
Jeśli automatyczny czas przechowywania nie jest możliwe dla niektórych powód, a następnie użyj inteligentnego wskaźnika dla alokacji dynamicznych. Biorąc pod uwagę, C++ 11 kompilator użyć unique_ptr
(lub rzadziej, shared_ptr
nawet weak_ptr
) dla elementów w map
(. Biorąc pod uwagę, C++ 03 kompilator, używać ich odpowiedniki boost)
map<string, unique_ptr<MyType>> my_map;
Następnie, po zniszczeniu my_map
, wszystkie elementy będą delete
d.
Baring wszystko to, jeśli jesteś w sytuacji, gdy żadna z powyższych będzie pracować dla Ciebie (chciałbym przez wysoce podejrzany), a następnie trzeba będzie wykonać iterację mapę youself:
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
W C++ 11, może to być wykonane lambda, coś wzdłuż linii:
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
Późniejsze - "map" (i większość (jeśli nie wszystkie?) Pojemników w standardowej bibliotece) nie zostało zaprojektowane do usuwania jakiegokolwiek wskaźnika, który zawiera po zniszczeniu. – Nbr44
Ok dzięki. Dokumentacja, którą przeczytałem, nie była zbyt jasna. Odczytano: "To skutecznie zmniejsza rozmiar kontenera o liczbę usuniętych elementów, które są niszczone." – Max
To powszechne nieporozumienie - sami autorzy punktów są rzeczywiście zniszczeni, ale to nie zmienia stanu pamięci, do której prowadzą. . – Nbr44