我有两种不同的情景:
shared_ptr
unique_ptr
答案可能是相同的。
考虑一种方法,该方法使用指针但不承担所有权:
void use_pointer(T ptr)
{
ptr->act();
}
应该是
my_type *
(原始指针)const shared_ptr<my_type> &
(发送const ref,如果使用shared_ptr)const unique_ptr<my_type> &
(发送const ref,如果使用unique_ptr)weak_ptr<my_type>
(为方法调用构建weak_ptr)还有别的吗?谢谢!
答案 0 :(得分:10)
如果您不承担所有权,那么最好接受对指针的引用。如果您想表达可选性,可以使用原始指针,或者您可以使用例如boost::optional<U&>
(其中U
是指针类型)。
不承担所有权的函数几乎不会接受智能指针。对于智能指针接口中的被调用者而言,除了到达指针对象之外,通常没有任何用处。所以通过它。
答案 1 :(得分:5)
让来电者决定:
template<typename T>
void use_pointer(const T& ptr)
{
ptr->act();
}
与原始指针很好地配合(如果调用者有一个具有自动或静态生命周期的数组),shared_ptr
,unique_ptr
,以及调用者传递的所有类型的迭代器类型你是集合中的一个元素。
答案 2 :(得分:3)
在这种情况下,它应该是my_type&
。如果你真的必须传递指针,那么只需传递一个原始指针:因为你在代码中使用智能指针,当有人看到原始指针时,他们不应该想“哦不,它可以泄漏!”而是“aha,一个非拥有的指针”(也就是说,假设他们熟悉惯用的C ++)。
答案 3 :(得分:0)
如果不知道为什么你有这个问题,就不可能回答这个问题 智能指针(而不是原始指针),并且不知道 被调用函数的语义,特别是它需要的原因 指针(而不是按值或通过const引用调用)。好一点 但是,如果函数采用类类型,则使用const 参考,否则,使用价值。 (但是有没有一个场景 你会指向一个不是类类型的东西?)
答案 4 :(得分:0)
如果函数要存储指针(例如添加到容器中),请使用std :: shared_ptr,otherwize使用std :: unique_ptr。如果你的指针已经是std :: shared_ptr,那么继续使用它。