Auf der Seite cplusplus.comshared_ptr
wird zwischen einer leeren std::shared_ptr
und einer Null unterschieden shared_ptr
. Die Seite cppreference.com ruft die Unterscheidung nicht explizit auf, sondern verwendet nullptr
in ihrer Beschreibung des std::shared_ptr
Verhaltens sowohl "leer" als auch Vergleich mit .
Gibt es einen Unterschied zwischen einer leeren und einer Null shared_ptr
? Gibt es einen Anwendungsfall für solche Zeiger mit gemischtem Verhalten? Ist eine nicht leere Null shared_ptr
überhaupt sinnvoll? Würde es im normalen Gebrauch jemals einen Fall geben (dh wenn Sie keinen explizit konstruiert hätten), in dem Sie am Ende eine leere, aber nicht null haben könnten shared_ptr
?
Und ändert sich eine dieser Antworten, wenn Sie die Boost-Version anstelle der C ++ 11-Version verwenden?
quelle
shared_ptr
Instanz mit einem nicht NULL gespeicherten Zeiger." Erwähnenswert ist auch der vorstehende Hinweis (S. 15): "Um die Möglichkeit eines baumelnden Zeigers zu vermeiden, muss der Benutzer dieses Konstruktors sicherstellen, dass dieserp
mindestens so lange gültig bleibt, bis die Eigentümergruppe vonr
zerstört wird." Eine selten verwendete Konstruktion.shared_ptr
derenget()
Renditenullptr
nicht gleich zu vergleichen , umnullptr
unabhängig davon , ob es irgendetwas besitzt.shared_ptr
s kann nützlich sein, um sicherzustellen, dass eine Funktion ausgeführt wird, sobald alle besitzenden Zeiger keinen Gültigkeitsbereich mehr haben (auch im Ausnahmefall!). Ich bin mir nicht sicher, ob es jetzt eine spezielle Klasse dafür gibt.shared_ptr
Nicht- Leerer tun, was ein Nicht-Null-und-Nicht- Leerer nichtshared_ptr
kann?r
" gegenüber der Formulierung "besitzt was auch immerr
besitzt"Gibt es einen Unterschied zwischen einem leeren und einem null shared_ptr?
Leer
shared_ptr
hat keinen Steuerblock und seine Verwendungsanzahl wird als 0 betrachtet. Eine Kopie von leershared_ptr
ist eine weitere leereshared_ptr
. Sie sind beide separateshared_ptr
s, die keinen gemeinsamen Steuerblock haben, weil sie ihn nicht haben. Leershared_ptr
kann mit dem Standardkonstruktor oder mit einem Konstruktor erstellt werden, der benötigtnullptr
.Nicht leere Null
shared_ptr
hat einen Steuerblock, der mit anderenshared_ptr
s geteilt werden kann. Eine Kopie der nicht leeren Nullshared_ptr
hatshared_ptr
denselben Steuerblock wie das Original,shared_ptr
sodass die Verwendungsanzahl nicht 0 ist. Es kann gesagt werden, dass alle Kopienshared_ptr
dieselbenullptr
Null haben . Nicht leere Nullshared_ptr
kann mit einem Nullzeiger vom Objekttyp (nichtnullptr
) erstellt werden.Hier ist ein Beispiel:
#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; }
Es gibt aus:
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
quelle