取消引用临时unique_ptr


unique_ptr<A> myFun()
{
    unique_ptr<A> pa(new A());
    return pa;
}
const A& rA = *myFun();

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

注意:如果我在取消引用之前将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"仅在语句结束时被销毁,因此它存在于副本中。

相关内容

  • 没有找到相关文章

最新更新