我知道std::unique_ptr
当一个对象只有一个所有者并且std::shared_ptr
当一个对象有多个所有者时使用它。成为对象的唯一所有者意味着什么?
作为唯一的所有者是否意味着没有其他人可以看到该对象?
get()
将指针作为引用传递时,我可以使用该方法返回原始指针吗?
我觉得如果我必须使用get()
,那么我要么通过 using 转移所有权std::move
,要么使用共享指针。
我知道std::unique_ptr
当一个对象只有一个所有者并且std::shared_ptr
当一个对象有多个所有者时使用它。成为对象的唯一所有者意味着什么?
作为唯一的所有者是否意味着没有其他人可以看到该对象?
get()
将指针作为引用传递时,我可以使用该方法返回原始指针吗?
我觉得如果我必须使用get()
,那么我要么通过 using 转移所有权std::move
,要么使用共享指针。
所有权就是:当不再需要资源时,谁来清理它?
成为资源的唯一所有者意味着当不再需要该对象时,只有您负责删除该对象。这意味着在您的生命结束后没有其他人可以使用该对象。如果其他人依赖于在您的生命结束后仍然存在的对象,则您需要共享所有权。
在现代 C++ 中,原始指针不应参与所有权。当您将原始指针传递给函数时,您希望该函数不会保留该指针以便以后使用它。
所有权谈论如何对对象的生命周期负责。
假设您有一个类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
因此它要么需要创建它的副本,要么需要声明对它的所有权。如果您不想创建副本,则需要将 aunique_ptr
移至该副本insert
或使用shared_ptr
.
但是,成为一个对象的唯一所有者意味着什么?
所有权意味着对动态对象(或更一般地,资源)的生命周期负责:当所有者结束所拥有对象的生命周期时,它负责清理(释放内存)。此外,所有者不必担心对象的生命周期会被其他东西结束。
唯一意味着没有其他对象可以共享所有权。
作为唯一的所有者是否意味着没有人可以看到该对象?
不,封装是一个正交概念。