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

How do I use unique_ptr in this scenario?

我对这段代码有疑问:

A* a = createAnAObject().get();

其中 createAnAObject() returns unique_ptr

问题是我必须这样做:

x.setA(a);   // Pass ownership here

X 对象必须拥有 A 对象的所有权,但是,据我了解,unique_ptr::get() 创建一个临时对象,该对象超出下一行的范围并调用析构函数,删除我的 A 对象?

我该怎么办?我无法更改 X 对象的接口。

我认为我需要将所有权转移给非 unique_ptr,因为我无法将 X class 更改为 unique_ptr。

您可以调用 release 而不是调用 get,这将为您提供底层指针并释放所有权。

A* a = createAnAObject().release();

如果您在两次调用之间有任何额外的代码,我建议您在调用 setA 之前保留 std::unique_ptr,这样如果出现问题,您就不会出现任何泄漏:

auto a_ptr = createAnAObject();
//...
x.setA(a_ptr.release());

调用此处定义的释放:unique_ptr它放弃所有权并可分配给您的 ptr。

要添加替代答案,setA() 可能应该按值取 std::unique_ptr,因为它打算声明所有权,因此代码可能变为:

auto a_ptr = createAnAObject();
//...
x.setA(std::move(a_ptr));

因此看不到丑陋的 .release()。毕竟,如果 setA() 做的第一件事就是抛出异常会怎样?现在你有一个指针逃脱了保护,它被可以正确释放它的东西所拥有。

编辑:如果你不能改变 X(并为他们的次优实施感到羞耻),那么你就会陷入 .release