C++:在原始指针上使用 shared_ptr<...>

C++: Using shared_ptr<...> over raw ptr

我有一个关于在原始 ptr 上使用 shared_ptr<...> 的问题。考虑以下示例:

shared_ptr<BaseClass> someName = shares_ptr<Derived>(new Derived);
shared_ptr<BaseClass> someName1 = shares_ptr<Derived1>(new Derived1(someName));

在这里,Derived1shared_ptr<BaseClass> 的实例作为其构造函数的输入。我使用 shared_ptr 主要是出于多态性的目的。由于一个 BaseClass 实例可以用作多个其他 Derived 实例的输入,因此 unique_ptr 不是一个选项,因为我必须一直更改所有权。

但所有权是我在这里最关心的问题。派生实例不拥有传递给构造函数的实例。传递原始 ptr 更好吗?

如果您需要管理指针的所有权,根据经验,总是优先选择 unique_ptr 而不是原始指针。如果你有理由(即如果你共享所有权,而不是一次与一个所有者转让所有权)更喜欢 shared_ptr 而不是原始指针。

如果您需要使用指针但不管理其生命周期,请使用 shared_ptr 进行管理,weak_ptr 使用指针而不进行生命周期管理。

您仍然可能会发现原始指针的一些用例,例如在辅助函数中需要格外小心,不要意外生成悬挂指针。