【发布时间】:2023-04-07 22:46:01
【问题描述】:
当一个函数采用 shared_ptr(来自 boost 或 C++11 STL)时,您是否传递了它:
通过常量引用:
void foo(const shared_ptr<T>& p)或按值:
void foo(shared_ptr<T> p)?
我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗?还是有其他问题?
能否请您说明您选择的原因,或者如果是,您认为这无关紧要的原因。
【问题讨论】:
-
问题是那些不等价的。参考版本尖叫“我要别名一些
shared_ptr,如果我愿意,我可以更改它。”而价值版本说“我要复制你的shared_ptr,所以虽然我可以更改它你永远不会知道。)一个 const-reference 参数是真正的解决方案,它说“我要给一些shared_ptr起别名,我保证不会改变它。”(这与按值语义极为相似!) -
嘿,我很想听听你们关于返回
shared_ptr班级成员的意见。你是通过 const-refs 来做的吗? -
第三种可能性是在 C++0x 中使用 std::move(),这会交换 shared_ptr
-
@Johannes:我会通过 const-reference 返回它,以避免任何复制/引用计数。再说一次,我通过 const-reference 返回所有成员,除非它们是原始的。
-
在 lambdas 中不应该遵循通过 ref 传递 shared_ptr 的习惯。如果它在其他地方被破坏(通过 ref 不会增加 ref 计数),您的回调/lambda 可能会崩溃。 OTOH,在 lambdas 中按值传递它也是危险的,并且可能导致内存泄漏。相反,我们应该将
weak_ptr传递给 shared_ptr。
标签: c++ c++11 boost shared-ptr