我对此代码有疑问:
A* a = createAnAObject().get();
其中createAnAObject()返回unique_ptr
问题是我必须这样做:
x.setA(a); // Pass ownership here
并且X
对象必须拥有A
对象的所有权,但是,据我所知,unique_ptr::get()
创建了一个临时对象,该对象超出了下一行的范围并调用析构函数,删除我的A
对象?
我该怎么办?我无法将界面更改为X
对象。
我认为我需要将所有权传递给非unique_ptr,因为我无法将X类更改为具有unique_ptr。
答案 0 :(得分:7)
您可以调用get
,而不是调用release
,这将为您提供基础指针和释放所有权。
A* a = createAnAObject().release();
如果您在两次通话之间有任何额外的代码,我建议保留std::unique_ptr
,直到您致电setA
,以便在事情发生时不会发生任何泄漏错误:
auto a_ptr = createAnAObject();
//...
x.setA(a_ptr.release());
答案 1 :(得分:2)
要添加备用答案,setA()
应该按值std::unique_ptr
计算,因为它打算声明所有权,因此代码可能会变为:
auto a_ptr = createAnAObject();
//...
x.setA(std::move(a_ptr));
因此看不到丑陋的.release()
。毕竟,如果setA()
做的第一件事就是抛出异常会发生什么?现在你有一个指针逃避保护它被正确释放它的东西所拥有。
编辑:如果你不能改变X(并且因为他们的次优实现而感到羞耻),那么你就会被.release
所困扰。
答案 2 :(得分:-2)
此处定义的呼叫释放:unique_ptr它放弃所有权并可分配给您的ptr。