2012-12-19 10 views
32

Załóżmy, że mam std :: vector of structs. Co dzieje się z pamięcią, jeśli wektor jest czysty()?Czy pamięć std :: vector została zwolniona po wyczyszczeniu?

std::vector<myStruct> vecs; 
vecs.resize(10000); 
vecs.clear(); 

Czy pamięć zostanie zwolniona lub nadal będzie dołączana do zmiennej vecs jako bufor do wielokrotnego użytku?

+1

Spróbuj wywołać 'pojemność()'. –

+0

Dziękuję wszystkim. Chcę, by pamięć została uwolniona - gwarantowana. Przydzielam więc wektor używając nowego std: vector , a następnie wywołaj delete kiedy skończę. W ten sposób pamięć zostanie uwolniona. –

+3

@AndrewS .: jedynym skutkiem alokacji dynamicznej jest wprowadzenie niewydolności. zobacz odpowiedź jerry'ego na rozsądny sposób na opróżnienie wektora. w ciele pętli innym dobrym sposobem jest po prostu uczynienie wektora lokalnym lokalnym ciałem pętli, tj. zadeklarowanie go w ciele pętli. –

Odpowiedz

42

Pamięć pozostaje dołączona do wektora. Jeśli chcesz go uwolnić, zwykle zamieniasz się z pustym wektorem. C++ 11 dodaje także funkcję składową shrink_to_fit, której celem jest zapewnienie mniej więcej tej samej możliwości bardziej bezpośrednio, ale nie jest ona wiążąca (innymi słowy, prawdopodobnie zwolni dodatkową pamięć, ale nadal nie jest do tego prawdziwa).

6

Destruktor wywoływany jest na obiektach, ale pamięć pozostaje przydzielona.

19

Pamięć wektora nie może zostać wyczyszczona. Po wyczyszczeniu nie można bezpiecznie uzyskać dostępu do elementów. Aby upewnić się, że pamięć jest zwalniane Scott Meyers Zaleca się, aby to zrobić:

vector<myStruct>().swap(vecs); 

Cplusplus.com ma następujący powiedzieć na ten temat:

Usuwa wszystkie elementy z wektora, nazywając ich odpowiednie destruktorów, pozostawiając pojemnik o rozmiarze 0.

Pojemność wektorowa nie ulega zmianie i nie ma miejsca przekierowanie z powodu wywoływania tej funkcji. Typową alternatywą, która wymusza realokację jest użycie zamiany: ...

4

Nie, pamięć nie zostanie zwolniona.

W C++ 11 można użyć metody shrink_to_fit, aby wymusić wektor w celu zwolnienia pamięci.

http://www.cplusplus.com/reference/vector/vector/

+3

Możesz go użyć, ale standard określa, że ​​* nie * wymusza dodatkową pamięć (§23.3.6.3/6): "shrink_to_fit jest niewiążącym żądaniem zmniejszenia pojemności() do rozmiaru()." –

+1

... a zatem jest prawie tak dobra, jak 'resize (0)', która * może * powodować efekt uboczny uwolnienia pamięci –

+0

Nie, 'resize (0)' jest [gwarantowane zachowanie pamięci] (http: //en.cppreference.com/w/cpp/container/vector/resize). –

Powiązane problemy