移动 unique_ptr 后,指向 unique_ptr 内容的指针的内容是否有效?
Is the contents of a pointer to a unique_ptr's contents valid after the unique_ptr is moved?
我被引导理解,在移出的 std::unique_ptr
的内容上调用成员函数是未定义的行为。我的问题是:如果我在 unique_ptr 上调用 .get()
然后 然后 移动它,原来的 .get()
指针会继续指向的内容吗原始唯一指针?
换句话说,
std::unique_ptr<A> a = ...
A* a_ptr = a.get();
std::unique_ptr<A> a2 = std::move(a);
// Does *a_ptr == *a2?
我认为是的,但我想确定一下。
('contents' 可能是错误的词。我的意思是当你取消引用指针时得到的数据)
仅移动 unique_ptr
只会更改指向对象的所有权,但不会使其无效(删除)。 unique_ptr<>::get()
指向的指针只要没有被删除就一直有效。例如,它会被拥有 unique_ptr<>
的析构函数删除。因此:
obj*ptr = nullptr; // an observing pointer
{
std::unique_ptr<obj> p1;
{
std::unique_ptr<obj> p2(new obj); // p2 is owner
ptr = p2.get(); // ptr is copy of contents of p2
/* ... */ // ptr is valid
p1 = std::move(p2); // p1 becomes new owner
/* ... */ // ptr is valid but p2-> is not
} // p2 destroyed: no effect on ptr
/* ... */ // ptr still valid
} // p1 destroyed: object deleted
/* ... */ // ptr invalid!
当然,您绝对不能尝试使用已移动的unique_ptr
,因为已移动的unique_ptr
没有内容。于是
std::unique_ptr<obj> p1(new obj);
std::unique_ptr<obj> p2 = std::move(p1);
p1->call_member(); // undefined behaviour
我被引导理解,在移出的 std::unique_ptr
的内容上调用成员函数是未定义的行为。我的问题是:如果我在 unique_ptr 上调用 .get()
然后 然后 移动它,原来的 .get()
指针会继续指向的内容吗原始唯一指针?
换句话说,
std::unique_ptr<A> a = ...
A* a_ptr = a.get();
std::unique_ptr<A> a2 = std::move(a);
// Does *a_ptr == *a2?
我认为是的,但我想确定一下。
('contents' 可能是错误的词。我的意思是当你取消引用指针时得到的数据)
仅移动 unique_ptr
只会更改指向对象的所有权,但不会使其无效(删除)。 unique_ptr<>::get()
指向的指针只要没有被删除就一直有效。例如,它会被拥有 unique_ptr<>
的析构函数删除。因此:
obj*ptr = nullptr; // an observing pointer
{
std::unique_ptr<obj> p1;
{
std::unique_ptr<obj> p2(new obj); // p2 is owner
ptr = p2.get(); // ptr is copy of contents of p2
/* ... */ // ptr is valid
p1 = std::move(p2); // p1 becomes new owner
/* ... */ // ptr is valid but p2-> is not
} // p2 destroyed: no effect on ptr
/* ... */ // ptr still valid
} // p1 destroyed: object deleted
/* ... */ // ptr invalid!
当然,您绝对不能尝试使用已移动的unique_ptr
,因为已移动的unique_ptr
没有内容。于是
std::unique_ptr<obj> p1(new obj);
std::unique_ptr<obj> p2 = std::move(p1);
p1->call_member(); // undefined behaviour