函数中的智能指针
Smart pointers in functions
这是严格意义上的理论问题。
当项目基于智能指针时,几乎所有 classes 都使用它们来包装它们的指针成员,将普通指针传递给 member/not 成员函数是一种不好的做法吗?
我的意思是,拥有像这样的成员函数是否正确:
void Function(SomeClass* pSomeClass);
或者应该始终是:
void Function(std::shared_ptr<SomeClass> pSomeClass);
我也想知道传递 const 引用是否有任何重要后果(标准 const 特性除外):
void Function(const std::shared_ptr<SomeClass>& pSomeClass)
当class使用std::unique_ptr
来保护其成员时,例如class私有成员函数中使用了指向其成员的指针,情况如何?是不是也要包起来还是应该认为是设计错误?
如果函数只需要指向的对象并且它必须始终是有效对象,而不是空对象,则通过引用传递对象(const 或非常量,取决于按照通常的规则)。
如果函数只需要指向的对象,或者可选的 null,则通过 原始指针(按照通常的规则传递给 const 或非常量)。
如果函数需要共享指向对象的所有权,按值传递shared_ptr
。
如果函数需要修改对象的shared_ptr
句柄(例如reset
),通过非常量引用传递shared_ptr
.
如果函数需要访问shared_ptr
句柄上的信息(如use_count
),但不应修改shared_ptr
,则传递shared_ptr
通过常量引用.
我认为 Herb Sutter 对此有一些很好的回答。 GotW about smart pointer usage, and a more recent presentation where he covers this. The new C++ Core Guidelines 有一个关于智能指针用法的完整部分。
简而言之,一切都归结为 "Take smart pointers as parameters only to explicitly express lifetime semantics"。如果您传递一个智能指针,这应该意味着您 talk/participate 拥有所有权,无论是共享的还是唯一的。对于非拥有参数,原始指针或 (const) 引用是当前的建议。
这是严格意义上的理论问题。 当项目基于智能指针时,几乎所有 classes 都使用它们来包装它们的指针成员,将普通指针传递给 member/not 成员函数是一种不好的做法吗? 我的意思是,拥有像这样的成员函数是否正确:
void Function(SomeClass* pSomeClass);
或者应该始终是:
void Function(std::shared_ptr<SomeClass> pSomeClass);
我也想知道传递 const 引用是否有任何重要后果(标准 const 特性除外):
void Function(const std::shared_ptr<SomeClass>& pSomeClass)
当class使用std::unique_ptr
来保护其成员时,例如class私有成员函数中使用了指向其成员的指针,情况如何?是不是也要包起来还是应该认为是设计错误?
如果函数只需要指向的对象并且它必须始终是有效对象,而不是空对象,则通过引用传递对象(const 或非常量,取决于按照通常的规则)。
如果函数只需要指向的对象,或者可选的 null,则通过 原始指针(按照通常的规则传递给 const 或非常量)。
如果函数需要共享指向对象的所有权,按值传递shared_ptr
。
如果函数需要修改对象的shared_ptr
句柄(例如reset
),通过非常量引用传递shared_ptr
.
如果函数需要访问shared_ptr
句柄上的信息(如use_count
),但不应修改shared_ptr
,则传递shared_ptr
通过常量引用.
我认为 Herb Sutter 对此有一些很好的回答。 GotW about smart pointer usage, and a more recent presentation where he covers this. The new C++ Core Guidelines 有一个关于智能指针用法的完整部分。
简而言之,一切都归结为 "Take smart pointers as parameters only to explicitly express lifetime semantics"。如果您传递一个智能指针,这应该意味着您 talk/participate 拥有所有权,无论是共享的还是唯一的。对于非拥有参数,原始指针或 (const) 引用是当前的建议。