Kontenery STL mają semantykę wartości. Po naciśnięciu obiektu do kontenera STL kontener STL zachowuje jego własną kopię obiektu, a gdy obiekt (kopia wewnętrzna) zostanie usunięty z kontenera, zostaje zniszczony.
Jeśli użyłeś kontenera typu proxy, raw pointers, smart pointers (shared_ptr, weak_ptr) lub adaptery (jako boost :: reference_wrapper), kontener STL zniszczy proxy, ale nie typ. Wybór jednego spośród innych jest zwykle kwestią tego, jak chcesz radzić sobie z zasobami.
Najbardziej popularny idiom używa surowych wskaźników, ale nie określają, kto jest odpowiedzialny za zniszczenie (kod, który ściąga z kontenera, powinien usunąć wskaźnik, lub zasób jest obsługiwany gdzieś indziej?).
Współczesne zastosowanie przesuwa się w kierunku podejścia shared_ptr, ponieważ osłabia problem własności. Obiekt zostanie utrzymany przy życiu po wyjęciu go z kontenera, a jeśli nikt inny nie posiada shared_ptr, obiekt zostanie automatycznie usunięty, gdy lokalny shared_ptr wykracza poza zakres. Użycie weak_ptr zachowuje prawo własności do oryginalnego kodu, ale pozwoli ci sprawdzić ważność wskaźnika (jeśli został usunięty) przed użyciem. Może to pozwolić na uniknięcie wykonywania operacji na obiekcie, który zostanie natychmiast usunięty.
Problem z podejściem shared_ptr/weak_ptr polega na tym, że zmusza cię do użycia shared_ptr do przechowywania oryginalnego zasobu. Oznacza to, że nie będzie można wstawić wskaźnika do podobiektu (atrybutu członka) innej klasy bez przeprojektowania klasy w celu przechowywania atrybutu przez shared_ptr, a to będzie miało inne implikacje (atrybuty nie będą już ciągłe w pamięci będą wymagane bardziej dynamiczne operacje alokacji ...)
Technika, która jest ledwo widoczne jest przy użyciu adapterów jak boost :: reference_wrapper <>. Opakowanie referencyjne to obiekt proxy, który zawiera odniesienie do oryginalnego obiektu i sam może być kopiowany. Przewagą nad prostymi wskaźnikami surowymi jest to, że po odczytaniu kodu jasne jest, że zasób jest zarządzany poza kolejką: kod pobierający dane z kolejki nie musi usuwać obiektu. Zaletą inteligentnego wskaźnika jest to, że nie trzeba przeprojektowywać innych części systemu, aby używać inteligentnych wskaźników. Wadą jest to, że tak jak w podejściu opartym na surowym wskaźniku, należy upewnić się, że czas życia obiektu, którego dotyczyło, przeżywa ręczne odniesienie do odniesienia w kontenerze.
jeśli przechowujesz wskaźniki w kolejce, ich usunięcie nie wywoła destruktora. –
Podobne pytanie: http://stackoverflow.com/questions/1525535/delete-all-items-from-a-c-stdvector –