auto foo = getSharedPointer().get();
Jedes Mal, wenn eine Funktion einen Typ zurückgibt, die keine Referenz ist, ist das Ergebnis der Aufruf der Funktion ein R-Wert. Da die Funktion getSharedPointer()
einen Klassentyp zurückgibt, ist das Ergebnis ein temporäres Objekt.
Die Lebensdauer dieses temporären Objekts ist definiert als das Ende der Auswertung des äußersten Ausdrucks, hier getSharedPointer().get()
. Sobald die foo
Variable initialisiert wird, wird der besitzende Smart Pointer zerstört; Wenn das letzte shared_ptr
Besitzer dieses Objekts zerstört wird, wird das Objekt gelöscht.
Hier getSharedPointer()
immer wieder shared_ptr
, die nicht das verwaltete Objekt nicht teilt (use_count()
1), so dass, wenn die Kopie der letzten shared_ptr
zerstört wird, wird das Objekt zerstört und der Zeiger auf das Objekt ist ungültig.
(Ich bin nicht sicher, warum Sie ein shared_ptr
zurückkehren und keine unique_ptr
hier.)
Die richtige Verwendung eines Smart-Pointer, oder jede Klasse, die „Eigentümer“ andere Ressourcen (die Lebensdauer der Kontrollen) (Ressourcen, auf die Sie immer noch direkt zugreifen dürfen, ist es, den "intelligenten" Zeiger/Eigentümer so lange am Leben zu halten, wie Sie auf die Ressource zugreifen müssen.
So muss der "intelligente" Zeiger (Eigentümerobjekt) benannt werden. Außerdem bin ich mir nicht sicher, ob Sie wirklich die Tatsache verbergen möchten, dass es sich um einen intelligenten Zeiger aus der Sicht des Lesers mit auto
handelt.
std::shared_pointer<Bar> foo = getSharedPointer();
// use foo.get()
Möglicherweise möchten Sie die genaue Art der verwalteten Objekt verstecken:
std::shared_pointer<auto> foo = getSharedPointer();
nicht 'getSharedPointer' in der Standardbibliothek oder gemeinsame Dritte dokumentiert gefunden. Keine Ahnung, was passiert. Empfehlen Sie, ein bisschen mehr Informationen hinzuzufügen. – user4581301