移动unique_ptr后,std :: unique_ptr ::返回的值是否有效?

Ily*_*kiy 10 move unique-ptr c++11

请考虑以下代码段:

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));
Run Code Online (Sandbox Code Playgroud)

只要new_owner保持在范围内,是否可以安全地假设ptr1有效?它似乎工作,但我找不到明确说明的规范 - 它是未定义的行为/实现特定的,恰好适合我,或上面发布的代码是有效的(ptr1保证指向移动指针为只要它还活着)?

Dan*_*rey 8

是的,它是有效的.

您可以有多个(普通)指针指向同一个对象.问题是这些指针有效的时间或指向的对象被删除的时间.

A unique_ptr存储另一个普通指针并获取所有权,这意味着它负责何时销毁对象.将它移动到另一个unique_ptr只是转移所有权,对象本身仍然是相同的,所有指向它的普通指针仍然有效.

只有当所有权未被转移(或释放)并且所有权unique_ptr被销毁时,它才会破坏该对象.这将是指向对象的所有普通指针成为悬空指针并且取消引用它们将是非法的时刻.


mgi*_*ida 7

是的,C ++ 11规范保证将对象的所有权从一个对象转移unique_ptr到另一个对象unique_ptr并不会更改对象本身的位置,并且get()第二个对象的unique_ptr返回值与unique_ptr转移之前第一个对象的返回值相同。

查看N3337,第20.7.1节:

  1. 另外,u可以根据要求将所有权转移到另一个唯一的指针u2。转让完成后,以下条件成立:

    • u2.p等于转移前u.p
    • u.p等于nullptr
    • 如果转移前u.d保持状态,则该状态已转移到u2.d

存储指针uunique_ptr对象在哪里u.p

第一个项目符号直接回答了问题,因为get()指定为返回u.p