拥有 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_area
、enlarge_shape
、shrink_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
.
我知道当一个对象只有一个所有者时使用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_area
、enlarge_shape
、shrink_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
.