2012-05-10 22 views

Odpowiedz

5

Jest zwalniany w tym sensie, że wywoływane są destruktory wszystkich zawartych obiektów, a wektor nie jest już właścicielem pamięci.

Ale tak naprawdę po prostu wrócił do wersji allocator, która może, ale nie musi, zwrócić ją do systemu operacyjnego.

Dopóki nie ma błędu w używanym alokatorze, nie utworzyłeś przecieku pamięci, jeśli to jest twój problem.


1. Jak @David zauważa w komentarzu poniżej, pamięć niekoniecznie jest zwalniane, w zależności od tego, czy wielkość musi się zmienić, czy nie.

+1

Przypisanie nie wymaga ponownego przydzielania, kopiowania i zwalniania starego bufora, jeśli wektor docelowy ma wystarczającą pojemność. Nie musi też niszczyć starych obiektów, ale może raczej użyć * operatora przypisania * do * przepisywania * pierwszych elementów 'min (v1.size(), v2.size())' (zakładając, że nie potrzebuje ponownie przydzielić. –

2

Ogólnie rzecz biorąc, niekoniecznie. Po przypisaniu jednego wektora do drugiego warunkiem post jest to, że obie tablice będą zawierały obiekty równoważne po zakończeniu operacji.

Jeśli capacity z docelowym wektora jest wystarczająco, operacja może być osiągnięte poprzez wywołanie operatora przypisania na planie min(v1.size(), v2.size()) elementów, a następnie albo destructing resztę elementów, jeżeli docelowy wektor odbyła więcej elementów, lub też kopiowanie-konstruowanie dodatkowych elementów na końcu. W takim przypadku nie zostanie wydane żadne zwolnienie lub alokacja pamięci.

Jeśli wektor docelowy nie ma wystarczającej pojemności, to utworzy nowy bufor o wystarczającej pojemności i kopiować-konstruować elementy w nowym buforze z wektora źródłowego. Następnie zamieni stare i nowe bufory, zniszczy wszystkie stare obiekty i zwolni stary bufor. W tym przypadku stare obiekty zostały zniszczone i stare pamięci zostały zwolnione, ale jest to tylko jeden przypadek.