取消引用临时unique_ptr

时间:2015-06-16 04:32:13

标签: c++ c++11 unique-ptr

unique_ptr<A> myFun()
{
    unique_ptr<A> pa(new A());
    return pa;
}

const A& rA = *myFun();

此代码编译但rA包含垃圾。有人可以向我解释为什么这段代码无效?

注意:如果我在解除引用之前将myFun的返回值分配给命名的unique_ptr变量,那么它可以正常工作。

2 个答案:

答案 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()临时只在声明结束时被破坏,所以它出现在副本中。