在这种情况下如何使用unique_ptr?

时间:2016-03-01 15:51:17

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

我对此代码有疑问:

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。

3 个答案:

答案 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。