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"仅在语句结束时被销毁,因此它存在于副本中。