我想要两种不同的场景:
- 您有
shared_ptr
- 您有
unique_ptr
答案可能是一样的。
考虑一种使用指针但不承担所有权的方法:
void use_pointer(T ptr)
{
ptr->act();
}
T应该是吗
my_type *
(原始指针)const shared_ptr<my_type> &
(如果使用shared_ptr,则发送const-ref)const unique_ptr<my_type> &
(如果使用unique_ptr,则发送const-ref)weak_ptr<my_type>
(为方法调用构造weak_ptr)
还有别的吗?谢谢
如果您不承担所有权,那么最好接受对指针对象的引用。如果要表达可选性,可以使用原始指针,也可以使用例如boost::optional<U&>
(其中U
是指针类型)。
不承担所有权的函数几乎永远不应该接受智能指针。通常,在智能指针接口中,除了获取指针对象的方法之外,对被调用者没有任何有用的东西。所以把它传过去吧。
让调用者决定:
template<typename T>
void use_pointer(const T& ptr)
{
ptr->act();
}
可以很好地处理原始指针(例如,如果调用方有一个具有自动或静态生存期的数组)、shared_ptr
、unique_ptr
,以及所有类型的迭代器类型(如果调用方从集合中传递一个元素)。
在这种情况下,它可能是my_type&
。如果你真的必须传递一个指针,那么就传递一个原始指针:因为你在代码中使用智能指针,所以当有人看到原始指针时,他们不应该认为"哦,不,它可能泄漏!",而应该认为"啊哈,一个无主指针"(也就是说,假设他们熟悉惯用C++)。
如果不知道为什么你有智能指针(而不是原始指针),并且不知道被调用函数的语义,特别是为什么它需要指针(而不是通过值或常量引用进行调用)。作为一件好事然而,起点是:如果函数采用类类型,请使用const引用,否则使用值。(但有没有一种情况你会有一个指向非类类型的指针吗?)
如果函数要存储指针(例如添加到容器中),请使用std::shared_ptr,otherwize则使用std::unique_ptr。如果您的指针已经是std::shared_ptr,那么继续使用它。