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