unique_ptr<A> myFun()
{
unique_ptr<A> pa(new A());
return pa;
}
const A& rA = *myFun();
此代码编译但rA
包含垃圾。有人可以向我解释为什么这段代码无效?
注意:如果我在解除引用之前将myFun
的返回值分配给命名的unique_ptr
变量,那么它可以正常工作。
答案 0 :(得分:12)
unique_ptr
会将所有权转移给另一个unique_ptr
,但在您的代码中,没有任何内容可以从返回的指针中获取所有权。换句话说,它不能转让所有权,因此它将被破坏。
正确的方法是:
unique_ptr<A> rA = myFun(); // Pass the ownership
或
const A rA = *myFun(); // Store the values before destruction
在你的代码中,返回的指针将被解析,引用将引用一个即将破坏的对象,之后使用此引用调用未定义的行为。
答案 1 :(得分:6)
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();
&#39; A&#39; myFun()
临时只在声明结束时被破坏,所以它出现在副本中。