Współwłasność: a średnia przyjmowane są prawie takie same jak ich odpowiedniki Google Boost . Używaj ich, gdy chcesz udostępnić zasób i nie wiesz, który z nich będzie ostatnim, który przeżyje. Służy do obserwowania udostępnionego zasobu bez wpływu na jego żywotność, aby nie przerywać cykli. Cykle z nie powinny normalnie się zdarzyć - dwa zasoby nie mogą się posiadać.
shared_ptr
weak_ptr
weak_ptr
shared_ptr
Pamiętaj, że Boost dodatkowo oferuje oferty shared_array
, które mogą być odpowiednią alternatywą dla shared_ptr<std::vector<T> const>
.
Następnie oferty Boost intrusive_ptr
, które są lekkim rozwiązaniem, jeśli Twój zasób oferuje już zarządzanie liczone według referencji i chcesz dostosować je do zasady RAII. Ten nie został przyjęty przez standard.
Unikalna własność:
Boost ma również scoped_ptr
opcję, której nie można skopiować i dla której nie można określić kasatora. std::unique_ptr
jest boost::scoped_ptr
na sterydach i powinien być domyślnym wyborem, gdy potrzebujesz inteligentnego wskaźnika . Pozwala określić separator w argumentach szablonu i jest ruchomy , w przeciwieństwie do boost::scoped_ptr
. Jest również w pełni użyteczny w kontenerach STL, o ile nie używasz operacji wymagających typów do kopiowania (oczywiście).
Zauważ jeszcze raz, że Boost ma wersję tablicową: scoped_array
którą zunifikował standard, wymagając std::unique_ptr<T[]>
częściowej specjalizacji, która będzie delete[]
wskaźnikiem zamiast delete
go (za pomocą default_delete
r). std::unique_ptr<T[]>
oferuje również operator[]
zamiast operator*
i operator->
.
Pamiętaj, że std::auto_ptr
nadal jest w standardzie, ale jest przestarzały .
§D.10 [depr.auto.ptr]
Szablon klasy auto_ptr
jest przestarzały. [ Uwaga: Szablon klasy unique_ptr
(20.7.1) zapewnia lepsze rozwiązanie. —Wskazówka ]
Brak prawa własności:
używaj głupich wskaźników (wskaźników surowych) lub odniesień do nieposiadających własności odniesień do zasobów i gdy wiesz, że zasób przeżyje obiekt / zakres odniesienia. Preferuj odniesienia i używaj surowych wskaźników, gdy potrzebujesz zerowalności lub możliwości resetowania.
Jeśli chcesz odwołać się do zasobu, który nie jest właścicielem, ale nie wiesz, czy zasób przeżyje obiekt, który się do niego odwołuje, spakuj go shared_ptr
i użyj weak_ptr
- możesz przetestować, czy rodzic shared_ptr
żyje lock
, co spowoduje zwraca wartość inną shared_ptr
niż null, jeśli zasób nadal istnieje. Jeśli chcesz sprawdzić, czy zasób jest martwy, użyj expired
. Oba mogą brzmieć podobnie, ale są bardzo różne w obliczu równoczesnego wykonywania, ponieważ expired
gwarantuje tylko wartość zwracaną dla tej pojedynczej instrukcji. Pozornie niewinny test
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
jest potencjalnym warunkiem wyścigu.