函数中的智能指针

Smart pointers in functions

本文关键字:指针 智能 函数      更新时间:2023-10-16

这是一个严格意义上的理论问题。当项目是基于智能指针的,所以实际上所有的类都使用它们来包装它们的指针成员时,将普通指针传递给成员/非成员函数是不是一种糟糕的做法?我的意思是,拥有像这样的成员功能是正确的吗

void Function(SomeClass* pSomeClass);

或者应该一直是:

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

我还想知道传递const引用是否有任何重要的后果(标准const特性除外):

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

当类使用std::unique_ptr来保护其成员,例如,在类私有成员函数中使用指向其成员的指针时,情况会怎样?它也应该包起来吗?还是应该将其视为设计错误?

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

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

如果函数需要共享指向对象的所有权,请按值传递shared_ptr

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

如果函数需要访问shared_ptr句柄(如use_count)上的信息,但不应修改shared_ptr,请通过常量引用传递shared_ptr

我认为Herb Sutter对此有一些很好的答案。有一个关于智能指针使用的GotW,以及他在最近的一个演示中介绍了这一点。新的C++核心指南有一个完整的关于智能指针使用的部分。

简而言之,这一切都归结为"将智能指针作为参数,仅用于显式表达生存期语义"。如果你传递了一个智能指针,这应该意味着你谈论/参与所有权,无论是共享的还是唯一的。对于非拥有参数,当前建议使用原始指针或(const)引用。