【发布时间】:2016-06-03 09:17:33
【问题描述】:
我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为 const& 而不是副本传递,如下所示:
void doSomething(std::shared_ptr<T> o) {}
对
void doSomething(const std::shared_ptr<T> &o) {}
但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,所以如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则 const 指针将变为无效。共享指针实际上应该防止的情况。我知道 const& 节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了,对吧?
【问题讨论】:
-
您应该只使用智能指针来管理对象的生命周期。当调用函数时,将 原始指针 或 引用 传递给 智能指针 正在管理的对象。见:github.com/isocpp/CppCoreGuidelines/blob/master/…
-
这取决于,您真的需要对
std::shared_ptr或仅指针进行操作吗?如果是后者,就拿一个const T&;doSomething不需要关心对象是如何存储的。 -
我同意以上所有观点,如果可能的话,请仅使用 const T&。
-
@Galik 如果函数需要延长对象的寿命怎么办?
-
@DavidSchwartz 完全属于“管理对象的生命周期”类别,不是吗?
标签: c++ shared-ptr