Inteligentny wskaźnik

Transkrypt

Inteligentny wskaźnik
Inteligentny
wskaźnik
M.Krysicki
Co to?
„Inteligentny wskaźnik to obiekt zachowujący się jak
wskaźnik, ale oferujący dodatkowe usługi”
Po co?
Wyciek pamięci
„Wystarczy pamiętać”
A gdyby tak wsk_str był obiektem?
Co mamy do wyboru?

auto_ptr

unique_ptr

shared_ptr

weak_ptr .
Przykład1
Różnice

auto_ptr

unique_ptr

shared_ptr
„Posiadacz”

Dzięki pojęciu własności można ustalić, do którego
wskaźnika należy dany obiekt

auto_ptr i unique_ptr pozwalają na usunięcie obiektu
tylko wtedy, jeżeli wskaźnik jest Posiadaczem tego
obiektu

shared_ptr wprowadza pojęcie zliczania referencji.
Dzięki temu wiadomo, ile wskaźników wskazuje na dany
obiekt. Nowe przypisanie zwiększa wartość licznika a
usuwanie – zmniejsza. Usuwanie obiektu odbywa się gdy
licznik powie, że jest to ostatni wskaźnik.
Zwykły wskaźnik

Program skompilował się

Program zadziałał
błędnie
auto_ptr

Program skompilował się

Program zadziałał
poprawnie
unique_ptr

Program nie skompilował się
shared_ptr

Program skompilował się

Program zadziałał
błędnie
Różnice: auto_ptr i unique_ptr

Auto_ptr pozwala na operację przypisania a unique_ptr nie

Właścicielami są p2 i p4, także p3 i p5 wskazują na nieistniejące dane

Dlaczego to jest niebezpieczne?
Różnice: auto_ptr i unique_ptr

Program skompilował się

Problem: o2=o1;

o1 przestaje być posiadaczem „5”

cout << *o1; wypisuje wskaźnik pusty,
co oznacza nieszczęśliwe zakończenie

To jest powód, dla którego auto_ptr
nie jest polecany.

Rozwiązanie:

Shared_ptr

Unique_prt
shared_ptr

Wszystkie wskaźniki shared_ptr są posiadaczami danego
obiektu.

Dozwolone jest przypisanie

Obiekt jest usunięty dopiero, gdy nie ma wskaźników na
niego wskazujących
Przykład3: zastosowanie w projekcie
Przykład3: zastosowanie w projekcie