请考虑以下代码段:
class Owner {
public:
Owner(std::unique_ptr<int> ptr) : owned_pointer<int>(std:move(ptr)) {}
private:
std::unique_ptr<int> owned_pointer;
};
std::unique_ptr<int> ptr(new int);
int* ptr1 = ptr.get();
Owner new_owner(std::move(ptr));
只要new_owner保持在范围内,假设ptr1有效是否安全?它似乎工作,但我找不到明确说明的规范 - 它是未定义的行为/实现特定的,恰好适合我,或上面发布的代码是有效的(ptr1保证指向移动指针,只要它还活着)?
答案 0 :(得分:8)
是的,它是有效的。
您可以有多个(普通)指针指向同一个对象。问题是这些指针有效的时间或指向的对象被删除的时间。
unique_ptr
存储一个更多的普通指针并取得所有权,这意味着它负责何时销毁该对象。将它移动到另一个unique_ptr
只是转移所有权,对象本身仍然是相同的,所有指向它的普通指针仍然有效。
只有当所有权未被转移(或释放)并且拥有unique_ptr
被销毁时,它才会销毁该对象。这将是所有指向对象的普通指针成为悬空指针并解除引用它们的时刻。
答案 1 :(得分:5)
是的,C ++ 11规范保证将对象的所有权从一个unique_ptr
转移到另一个unique_ptr
不会改变对象本身的位置,并且第二个get()
上的unique_ptr
返回与转移前第一个unique_ptr
相同的内容。
查看N3337,第20.7.1节:
- 醇>
此外,
u
可以根据请求将转让所有权转移到另一个唯一指针u2
。完成此类转让后,如下 后置条件持有:
u2.p
等于转移前u.p
,u.p
等于nullptr
和- 如果保留转移前
u.d
状态,则此状态已转移至u2.d
。
其中u
是存储指针unique_ptr
的{{1}}对象。
第一个项目符号会直接回答问题,因为u.p
被指定为返回get()
。