拥有 unique_ptr 对象的唯一所有权是什么意思?

What does it mean to have sole ownership of object for unique_ptr?

我知道当一个对象只有一个所有者时使用std::unique_ptr,当一个对象有多个所有者时使用std::shared_ptr。成为对象的唯一所有者是什么意思?

作为唯一所有者是否意味着没有其他人可以看到该对象?

当将指针作为引用传递时,我可以return使用get()方法的原始指针吗?

我觉得如果我必须使用get(),那么我要么使用std::move转移所有权,要么使用共享指针。

所有权的全部意义在于:当资源不再需要时,谁来清理它?

成为资源的唯一所有者意味着只有您负责删除不再需要的对象。这意味着在您的生命周期结束后,没有其他人可以使用该对象。如果其他人依赖于您的生命周期结束后仍然存在的对象,则您需要共享所有权。

在现代 C++ 中,原始指针不应参与所有权。当您将原始指针传递给函数时,您希望此函数不会保留此指针以便稍后使用它。

But whet does it means to be the unique owner of an object?

所有权意味着负责动态对象(或更一般地,资源)的生命周期:当所有者结束所拥有对象的生命周期时,它负责清理(释放内存)。此外,所有者无需担心对象的生命周期被其他东西结束。

唯一意味着没有其他对象可以共享所有权。

Does being the unique owner means that nobody get to see the object?

没有。封装是一个正交的概念。

所有权谈论如何对对象的生命周期负责。

假设您有一个 class shape,您可以在上面执行各种操作,例如计算表面积、放大或缩小该对象,...

并且这些任务由自由函数执行 calculate_shape_areaenlarge_shapeshrink_shape,并且您将形状传递给该函数,那么这些函数不需要拥有该函数对象,他们只需要在调用时知道对象。所以你可以(并且应该)将该对象作为原始指针传递:

struct shape {};

double calculate_shape_area(shape* obj) {
   // calculate the area, obj is only used within that function
   // and not stored anywhere else
}

int main() {
  auto obj = std::make_unique<shape>();
  auto area = calculate_shape_area(obj.get());
}

另一方面,如果您想要使用 insert 将该形状存储在场景图中,并且该场景图将在稍后的步骤中显示所有形状。然后场景图需要在调用 insert 之后了解该对象,因此它要么需要创建它的副本,要么需要声明对它的所有权。如果您不想创建副本,则需要将 unique_ptr 移动到那个 insert 或使用 shared_ptr.