std::vector
zarządza własną pamięcią. Oznacza to, że gdy wywoływany jest destruktor wektora, pamięć utrzymywana przez wektor jest zwalniana. std::vector
wywołuje także destruktor obiektu po jego usunięciu (poprzez erase
, pop_back
, clear
lub destruktora wektora).
Kiedy to zrobić:
Radio newradio(radioNum);
m_radios.push_back(newradio);
dodać kopię newradio
(utworzony za pomocą Radio
„s kopiować konstruktora) do wektora. newradio
zostanie zniszczony, gdy zniknie z zakresu, a kopia zostanie zniszczona, gdy zostanie usunięta z wektora (jak dla dowolnego obiektu).
To ważny punkt: std::vector
wyłącznie magazynuje kopie obiektu, co oznacza, że obiekt musi mieć znaczący konstruktor kopiujący (i operator przypisania, ale to inna kwestia). Jeśli masz wektor wskaźników, sam wskaźnik zostanie skopiowany, a nie to, co wskazuje. Należy zauważyć, że to zachowanie jest takie samo dla każdego standardowego kontenera (np. std::list
lub std::set
).
Zgodnie z ogólną zasadą, jeśli nie używasz wskaźników, nie musisz się martwić o samo zwolnienie pamięci.
C++ 11, najbardziej standardowe pojemniki (w tym vector
) mają sposób emplace_back
budujące obiekt zamiast na końcu pojemnika. Pobiera kilka parametrów i wywołuje konstruktora, który najlepiej pasuje do tych parametrów (lub kończy się niepowodzeniem, jeśli nie istnieje taki konstruktor), używając wspomnianego konstruktora do utworzenia obiektu, bez żadnej kopii, na końcu kontenera. Więc, powyższy kod może być zapisane jako:
m_radios.emplace_back(radioNum); // construct a Radio in place,
// passing radioNum as the constructor argument
także w C++ 11, pojemniki są zwykle przenieść świadomość, więc nie wymagają już obiektów do copiable: jeśli są ruchomy, a następnie kontener przeniesie swoją zawartość zgodnie z wymaganiami (na przykład podczas realokacji). Kopiowane typy są nadal wymagane, jeśli chcesz skopiować wektor.
Choć poprawne w czasie, to odpowiedź może wykorzystać aktualizacji przywołujące 'emplace_back' –
bardzo dobry punkt Mr Duck. –