unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
此代碼編譯但rA
包含垃圾。有人可以向我解釋爲什麼此代碼無效?解引用臨時unique_ptr
注意:如果在取消引用它之前將myFun
的返回值指定給名爲unique_ptr
的變量,它將正常工作。
unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
此代碼編譯但rA
包含垃圾。有人可以向我解釋爲什麼此代碼無效?解引用臨時unique_ptr
注意:如果在取消引用它之前將myFun
的返回值指定給名爲unique_ptr
的變量,它將正常工作。
unique_ptr
將把所有權轉交給另一個unique_ptr
,但是在您的代碼中沒有任何東西可以從返回指針捕獲所有權。換句話說,它不能轉移所有權,所以它會被破壞。 正確的方法是:
unique_ptr<A> rA = myFun(); // Pass the ownership
或
const A rA = *myFun(); // Store the values before destruction
在代碼中,返回指針將被desructed和參考使用該參考所調用指的被很快破壞的對象,在此之後一個未定義的行爲。
unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
你做了最後一行是什麼:
unique_ptr<A>* temporary = new unique_ptr<A>(nullptr);
myFun(&temporary);
const A& rA = *temporary.get();
delete temporary; // and free *temporary
當你刪除temporary
它與你它擁有指針和引用內存的合同。所以它破壞了A
並釋放了內存。
與此同時,您已經偷偷地將指向該內存的指針作爲對該地址處對象的引用。
你既可以將指針傳遞到本地的unique_ptr:
unique_ptr<A> a = myFun();
,或者你可以複製的對象:
A = *myFun().get();
的「A」到myFun()
暫時的只破壞在關閉聲明,所以它的副本。
我有點困惑。什麼是'unique_ptr *',一個原始指針指向'unique_ptr'? 'myFun'不帶任何參數,爲什麼'myFun(&temporary)'有效? –
@MiloLu:這是僞代碼,演示myFun的返回值的生命週期。 – ildjarn
由於您沒有存儲'myFun'返回的'unique_ptr',所以它的析構函數在表達式的末尾被調用,並且它所擁有的對象被釋放。 –
@buttifulbuttefly我看到在組裝中,我不明白如何觸發析構函數調用。 – Kam
[在電視上看到](https://www.youtube.com/watch?v=hEx5DNLWGgA#t=44m2s) –