unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
Was Sie auf der letzten Zeile tat
unique_ptr<A>* temporary = new unique_ptr<A>(nullptr);
myFun(&temporary);
const A& rA = *temporary.get();
delete temporary; // and free *temporary
Wenn Sie temporary
löschen es hat einen Vertrag mit Ihnen, dass es den Zeiger und den Speicher besitzt, die bezieht. So zerstört es die A
und gibt den Speicher frei.
In der Zwischenzeit haben Sie einen Verweis auf diesen Speicher als Verweis auf das Objekt an dieser Adresse schleichend gehalten.
Sie könnten entweder den Zeiger auf eine lokale unique_ptr übertragen:
unique_ptr<A> a = myFun();
oder Sie können die Objekte kopieren:
A = *myFun().get();
Das 'A' auf die myFun()
s vorübergehend nur an der destructed Abschluss der Aussage, so ist es für die Kopie vorhanden.
Da Sie das 'unique_ptr' nicht speichern, das' myFun' zurückgibt, wird sein Destruktor am Ende des Ausdrucks aufgerufen, und das Objekt, das ihm gehört, wird freigegeben. –
@buttifulfulbuttefly Ich sah, dass in der Desassembly ich nicht verstehe, wie der Destruktor Aufruf ausgelöst wird. – Kam
[Wie im Fernsehen gesehen] (https://www.youtube.com/watch?v=hEx5DNLWGgA#t=44m2s) –