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_ptrweak_ptrweak_ptrshared_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_ptropcję, której nie można skopiować i dla której nie można określić kasatora. std::unique_ptrjest boost::scoped_ptrna 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_arrayktórą zunifikował standard, wymagając std::unique_ptr<T[]>częściowej specjalizacji, która będzie delete[]wskaźnikiem zamiast deletego (za pomocą default_deleter). std::unique_ptr<T[]>oferuje również operator[]zamiast operator*i operator->.
Pamiętaj, że std::auto_ptrnadal jest w standardzie, ale jest przestarzały .
§D.10 [depr.auto.ptr]
Szablon klasy auto_ptrjest 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_ptri użyj weak_ptr- możesz przetestować, czy rodzic shared_ptrżyje lock, co spowoduje zwraca wartość inną shared_ptrniż 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ż expiredgwarantuje 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.