Cplusplus.com shared_ptr
strona nazywa się rozróżnienie między pusty std::shared_ptr
a wartość null shared_ptr
. Strona cppreference.com nie wyjaśnia wyraźnie tego rozróżnienia, ale nullptr
w opisie std::shared_ptr
zachowania używa zarówno słowa „pusty”, jak i porównania .
Czy jest różnica między pustym a null shared_ptr
? Czy jest jakiś przypadek użycia dla takich wskaźników o mieszanym zachowaniu? Czy niepusty null ma w shared_ptr
ogóle sens? Czy kiedykolwiek byłby przypadek w normalnym użyciu (tj. Gdybyś nie skonstruował go jawnie), w którym mógłbyś skończyć z pustym, ale niezerowym shared_ptr
?
I czy któraś z tych odpowiedzi ulegnie zmianie, jeśli używasz wersji Boost zamiast wersji C ++ 11?
źródło
shared_ptr
instancji z przechowywanym wskaźnikiem innym niż NULL”. Warto również wspomnieć o poprzedniej uwadze (s. 15), „Aby uniknąć możliwości wiszącego wskaźnika, użytkownik tego konstruktora musi zapewnić, żep
pozostanie on ważny przynajmniej do momentur
zniszczenia grupy własności ”. Rzeczywiście rzadko używana konstrukcja.shared_ptr
któregoget()
powracanullptr
ma porównać równenullptr
, niezależnie od tego, czy jest właścicielem czegokolwiek.shared_ptr
s może być przydatna, aby upewnić się, że jakaś funkcja zostanie wykonana, gdy wszystkie wskaźniki będące właścicielami skończą się poza zakresem (nawet w przypadku wyjątku!). Nie jestem pewien, czy istnieje teraz specjalna klasa do tego.shared_ptr
zrobić element niezerowy i niepustyshared_ptr
?r
” od wyrażenia „ posiada wszystko, cor
posiada”Czy istnieje różnica między pustym a null shared_ptr?
Empty
shared_ptr
nie ma bloku kontrolnego, a jego licznik użycia uważany jest za 0. Kopia pustegoshared_ptr
to kolejny pustyshared_ptr
. Oba są oddzielnymishared_ptr
elementami, które nie mają wspólnego bloku sterującego, ponieważ go nie mają. Emptyshared_ptr
można skonstruować za pomocą domyślnego konstruktora lub konstruktora, który pobieranullptr
.Niepusty null
shared_ptr
ma blok kontrolny, który może być współdzielony z innymishared_ptr
s. Kopia niepustej wartości nullshared_ptr
jestshared_ptr
taka, że dzieli ten sam blok kontrolny co oryginał,shared_ptr
więc liczba użytych wartości nie jest równa 0. Można powiedzieć, że wszystkie kopieshared_ptr
mają takie samenullptr
. Niepusty nullshared_ptr
można skonstruować za pomocą pustego wskaźnika typu obiektu (nienullptr
)Oto przykład:
#include <iostream> #include <memory> int main() { std::cout << "std::shared_ptr<int> ptr1:" << std::endl; { std::shared_ptr<int> ptr1; std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; std::cout << "std::shared_ptr<int> ptr1(nullptr):" << std::endl; { std::shared_ptr<int> ptr1(nullptr); std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; std::cout << "std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))" << std::endl; { std::shared_ptr<int> ptr1(static_cast<int*>(nullptr)); std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl; std::shared_ptr<int> ptr2 = ptr1; std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl; std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl; } std::cout << std::endl; return 0; }
Wyprowadza:
std::shared_ptr<int> ptr1: use count before copying ptr: 0 use count after copying ptr: 0 ptr1 is null std::shared_ptr<int> ptr1(nullptr): use count before copying ptr: 0 use count after copying ptr: 0 ptr1 is null std::shared_ptr<int> ptr1(static_cast<int*>(nullptr)) use count before copying ptr: 1 use count after copying ptr: 2 ptr1 is null
http://coliru.stacked-crooked.com/a/54f59730905ed2ff
źródło