2010-09-13 12 views
9

Przepraszam, jeśli jest to gdzieś jednoznacznie odebrane, ale jestem nieco zdezorientowany przez dokumentację doładowania i artykuły, które czytałem online.pytanie dotyczące zadania z boost :: shared_ptr (kontra funkcja reset())

widzę, że mogę korzystać z funkcji reset(), aby zwolnić pamięć w shared_ptr (zakładając, że liczba referencyjna spadnie do zera), np

shared_ptr<int> x(new int(0)); 
x.reset(new int(1)); 

to wierzę, doprowadziłoby do powstania dwóch obiektów całkowitych, a pod koniec tych dwóch linii liczba całkowita równa zero zostanie usunięta z pamięci.

Ale co zrobić, jeśli używam następujący fragment kodu:

shared_ptr<int> x(new int(0)); 
x = shared_ptr<int>(new int(1)); 

Oczywiście teraz * x == 1 jest prawdziwe, ale oryginalny obiekt Integer (równa zero) zostaną usunięte z pamięci lub mieć Przeniosłem tę pamięć?

Wydaje mi się, że byłby to problem operatora przypisania zmniejszającego liczbę referencyjną shared_ptr, ale rzut oka na kod źródłowy nie wydaje mi się, aby to pytanie było dla mnie jasne. Mam nadzieję, że ktoś bardziej doświadczony lub kompetentny może mi pomóc. Z góry dziękuję.

Odpowiedz

15

Dokumentacja jest dość jasne:

shared_ptr & operator=(shared_ptr const & r); // never throws

Efekty: Odpowiednik shared_ptr(r).swap(*this).

Po prostu zamienia własność z tymczasowym obiektem, który utworzysz. Czas tymczasowy wygasa, zmniejszając licznik referencji. (I zwolnienie, jeśli zero.)


Celem tych pojemników jest nie wyciek pamięci. Więc nie, nie musisz martwić się o wyciek, chyba że próbujesz zepsuć sprawę celowo. (Innymi słowy, prawdopodobnie nie musisz wątpić, że Boost wie, co robi.)

+0

Widziałem to, ale wtedy zobaczyłem również dodatkowe informacje, które mogły być w konflikcie. Dzięki za sprawdzenie zdrowia psychicznego. – RandomGuy

5

Nie wyciekłeś pamięci. Pamięć dla pierwszego obiektu int zostanie usunięta.

Powiązane problemy