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));
在这里,Derived1
将 shared_ptr<BaseClass>
的实例作为其构造函数的输入。我使用 shared_ptr 主要是出于多态性的目的。由于一个 BaseClass
实例可以用作多个其他 Derived
实例的输入,因此 unique_ptr 不是一个选项,因为我必须一直更改所有权。
但所有权是我在这里最关心的问题。派生实例不拥有传递给构造函数的实例。传递原始 ptr 更好吗?
如果您需要管理指针的所有权,根据经验,总是优先选择 unique_ptr
而不是原始指针。如果你有理由(即如果你共享所有权,而不是一次与一个所有者转让所有权)更喜欢 shared_ptr
而不是原始指针。
如果您需要使用指针但不管理其生命周期,请使用 shared_ptr
进行管理,weak_ptr
使用指针而不进行生命周期管理。
您仍然可能会发现原始指针的一些用例,例如在辅助函数中需要格外小心,不要意外生成悬挂指针。
我有一个关于在原始 ptr 上使用 shared_ptr<...>
的问题。考虑以下示例:
shared_ptr<BaseClass> someName = shares_ptr<Derived>(new Derived);
shared_ptr<BaseClass> someName1 = shares_ptr<Derived1>(new Derived1(someName));
在这里,Derived1
将 shared_ptr<BaseClass>
的实例作为其构造函数的输入。我使用 shared_ptr 主要是出于多态性的目的。由于一个 BaseClass
实例可以用作多个其他 Derived
实例的输入,因此 unique_ptr 不是一个选项,因为我必须一直更改所有权。
但所有权是我在这里最关心的问题。派生实例不拥有传递给构造函数的实例。传递原始 ptr 更好吗?
如果您需要管理指针的所有权,根据经验,总是优先选择 unique_ptr
而不是原始指针。如果你有理由(即如果你共享所有权,而不是一次与一个所有者转让所有权)更喜欢 shared_ptr
而不是原始指针。
如果您需要使用指针但不管理其生命周期,请使用 shared_ptr
进行管理,weak_ptr
使用指针而不进行生命周期管理。
您仍然可能会发现原始指针的一些用例,例如在辅助函数中需要格外小心,不要意外生成悬挂指针。