2011-10-28 12 views
5

Mam zmienną składową klasy tak:Jak zwolnić std :: vector, jeśli nie ma pamięci sterty

vector<vector<int> > m_stacks; 

Kiedy wypełnić go, robię tak:

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
m_stacks.push_back(v); 
vector<int> v2; 
v2.push_back(1); 
v2.push_back(2); 
m_stacks.push_back(v2); 

teraz Zastanawiam się, co powinienem zrobić w destruktorze klas, aby zwolnić m_stacks. Nie przydzielam do tego pamięci sterty, więc walczę, jeśli naprawdę muszę coś zrobić. W końcu wymyślić to -

vector<vector<int> >::iterator itr = m_stacks.begin(); 
for (; itr != m_stacks.end(); ++itr) { 
    itr->clear(); 
} 

myślę, że to jest najbardziej potrzebne do zrobienia, nie muszę zadzwonić m_stacks.clear(). Powodem jest to, że destruktor wektora może automatycznie zwolnić pamięć. Nadal jednak potrzebuję powyższego kodu, ponieważ destruktor wektorowy nie wywołuje destruktora elementu.

Czy możesz potwierdzić moje połączenie?

Odpowiedz

14

Nie musisz nic robić dla m_stacks (członek danych class). Nabyta pamięć zostanie zwolniona automatycznie po wywołaniu destruktora class. Jest to cel, dla którego użyto std::vector.

6

Destruktor wywołuje błąd w przydzielonej pamięci, tym samym wywołując ten typ (w tym przypadku destruktor std::vector<int>).

Te struktury danych opierają się na zasadach SBRM (zarządzanie zakresem zasobów) lub RAII (zasada pozyskiwania zasobów to inicjalizacja), ponieważ cała przydzielana pamięć jest usuwana z pamięci po wykryciu zakresu (np. Klasa).

Nie musisz się martwić zwolnieniem pamięci z std::vector, chyba że posiada typ, który wskazuje na pamięć; ale nie uwalnia go z natury (np. wskaźnik!).

8

Destrukcja wektora spowoduje dwie rzeczy: zniszczy każdy element wektora, a następnie zwolni pamięć używaną dla samego wektora. To jest automatyczne.

W twoim przypadku masz wektory zagnieżdżone dwa głębokie, ale to nie ma znaczenia. Gdy wektor najwyższego poziomu zostanie zniszczony, wywoła destruktor dla każdego z zawartych w nim wektorów, a wszystkie te wektory odpowiednio się oczyszczą.

Powiązane problemy