[英]Dereferencing a temporary unique_ptr
unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
此代碼編譯但rA
包含垃圾。 有人可以向我解釋為什么這段代碼無效?
注意:如果我在解除引用之前將myFun
的返回值myFun
給命名的unique_ptr
變量,它可以正常工作。
unique_ptr
會將所有權傳遞給另一個unique_ptr
,但在您的代碼中,沒有任何內容可以從返回的指針中獲取所有權。 換句話說,它不能轉讓所有權,因此它將被破壞。 正確的方法是:
unique_ptr<A> rA = myFun(); // Pass the ownership
要么
const A rA = *myFun(); // Store the values before destruction
在您的代碼中,返回的指針將被解析,引用將引用一個即將破壞的對象,之后使用此引用調用未定義的行為。
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();
myFun()
臨時的'A'只在聲明結束時被破壞,所以它存在於副本中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.