在这种情况下如何使用 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
。
我对这段代码有疑问:
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
。