功能中的智能指针

时间:2015-12-17 07:39:35

标签: c++ std smart-pointers

这是严格的理论问题。 当项目基于智能指针时,几乎所有类都使用它们来包装它们的指针成员,将普通指针传递给成员/非成员函数是不好的做法? 我的意思是,拥有成员函数是正确的:

void Function(SomeClass* pSomeClass);

或者应该永远是:

void Function(std::shared_ptr<SomeClass> pSomeClass);

如果传递const引用有任何重要后果(标准const特性除外),我也会徘徊:

void Function(const std::shared_ptr<SomeClass>& pSomeClass)

当类使用std::unique_ptr来保护其成员时的情况怎么样?例如,在类私有成员函数中使用指向其成员的指针?它应该包裹吗?或者它应该被视为设计错误?

2 个答案:

答案 0 :(得分:9)

如果函数只需要指向对象并且它必须始终是有效对象,而不是null,则通过引用传递对象(const或非const,具体取决于通常的规则)

如果函数只需要指向对象,或者可选地为null,则通过原始指针(按照通常的规则传递给const或非const)。

如果该功能需要共享指向对象的所有权,请按值> shared_ptr传递。

如果函数需要修改对象的shared_ptr句柄(例如reset),则通过非const引用传递 shared_ptr

如果该功能需要访问shared_ptr句柄上的信息(例如use_count),但不应修改shared_ptr,请传递 shared_ptr const参考

答案 1 :(得分:5)

我认为Herb Sutter对此有一些好的答案。有一个关于智能指针使用的GotW,以及a more recent presentation,其中包含了这一点。新的C++ Core Guidelines有一个关于智能指针使用的完整部分。

简而言之,这一切都归结为"Take smart pointers as parameters only to explicitly express lifetime semantics"。如果你传递一个智能指针,这应该意味着你说话/参与所有权,无论是共享还是独特。对于非拥有参数,原始指针或(const)引用是当前的建议。