簡體   English   中英

取消引用臨時unique_ptr

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM