Was ist der Unterschied zwischen einer leeren und einer null-std::shared_ptr in C++?
Den cplusplus.com shared_ptr
- Seite ruft eine Unterscheidung zwischen einem leer std::shared_ptr
und ein null shared_ptr
. Die cppreference.com Seite nicht explizit aufrufen, aus der Unterscheidung verwendet wird, sondern beide "leer" und der Vergleich zu nullptr
in seiner Beschreibung der std::shared_ptr
Verhalten.
Gibt es einen Unterschied zwischen einem leeren und einem null -shared_ptr
? Gibt es eine Verwendung für solche mixed-Verhalten Zeiger? Hat eine nicht-leere null shared_ptr
überhaupt Sinn? Würde es jemals einen Fall, bei normaler Nutzung (d.h. wenn Sie nicht explizit konstruieren eins), wo Sie könnten am Ende mit einem empty-aber-nicht-null -shared_ptr
?
Und diese Antworten ändern sich, wenn Sie die Boost-version statt des C++11-version?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine komische Ecke
shared_ptr
Verhalten. Es hat einen Konstruktor, der erlaubt Ihnen, eineshared_ptr
dass besitzt etwas und Punkte zu etwas anderes:Den
shared_ptr
konstruiert mit diesem Konstruktor Aktien Eigentum mitr
, aber Punkte zu wasptr
Punkte auf (D. H., Aufrufget()
oderoperator->()
zurückptr
). Dies ist nützlich für Fälle, in denenptr
Punkte zu einem Unterobjekt (z.B. ein Daten-member) der das Objekt im Besitz vonr
.Die Seite, die du verlinkt fordert eine
shared_ptr
besitzt nichts leer, und einshared_ptr
dass Punkte nichts (d.h., derenget() == nullptr
) null. (Leer in diesem Sinne gebraucht wird, indem der standard; null nicht.) Können Sie konstruieren eine null-aber-nicht-leershared_ptr
, aber es wird nicht sehr sein nützlich. Eine leere-aber-nicht-null -shared_ptr
ist im wesentlichen ein nicht-besitzende Zeiger, die verwendet werden können, zu tun einige seltsame Dinge, wie übergeben Sie einen Zeiger auf etwas auf dem Stapel reserviert, um eine Funktion erwartet einenshared_ptr
(aber ich würde vorschlagen, Stanz-wer legteshared_ptr
innerhalb der API zuerst).boost::shared_ptr
auch dieser Konstruktor hat, die Sie rufen die aliasing Konstruktor.shared_ptr
Instanz, die einen nicht-NULL-Zeiger gespeichert." Erwähnenswert ist auch der vorhergehende Hinweis (p15), "um Zu vermeiden, die Möglichkeit, einen dangling pointer, der Benutzer dieser Konstruktor muss sicherstellen, dassp
gültig bleibt, zumindest solange das Eigentum Gruppe vonr
ist zerstört." Eine selten verwendete Konstruktion in der Tat.shared_ptr
derenget()
zurücknullptr
nicht vergleichen Sie gleichnullptr
unabhängig davon, ob er etwas besitzt.shared_ptr
s kann nützlich sein, um sicherzustellen, dass eine Funktion ausgeführt, sobald alle besitzenden Zeiger laufen out of scope (auch im Fall einer Ausnahme!). Nicht sicher, ob es nun eine spezielle Klasse für diese.shared_ptr
tun, dass ein nicht-null-und-nicht leershared_ptr
nicht kann?nullptr
null zushared_ptr
erstellen Sie ein "reference counting" - block?r
" um die Formulierung "besitzt, wasr
besitzt"Gibt es einen Unterschied zwischen leer und null shared_ptr?
Leer
shared_ptr
muss nicht die Kontrolle haben block und seine Verwendung Zählung als 0 ist. Kopieren von leerenshared_ptr
ist ein weiteres leeresshared_ptr
. Sie sind sowohl in separatenshared_ptr
s, keine gemeinsamen Steuerblock, weil Sie es nicht haben. Leershared_ptr
konstruiert werden können, die mit Standard-Konstruktor oder mit Konstruktornullptr
.Nicht-leere null
shared_ptr
hat control-block, der geteilt werden kann mit anderenshared_ptr
s. Kopieren von nicht-leeren nullshared_ptr
istshared_ptr
mit demselben control-block als originalshared_ptr
so verwenden Sie count nicht 0 ist. Es kann gesagt werden, dass alle Kopien vonshared_ptr
teilen die gleichennullptr
. Nicht-leere nullshared_ptr
konstruiert werden können, die mit null-pointer-Objekt-Typ (nichtnullptr
)Hier ist ein Beispiel:
It-Ausgänge:
http://coliru.stacked-crooked.com/a/54f59730905ed2ff