我想知道在使用之前是否需要检查sp
是否为null
。
纠正我,如果我错了,但创建一个别名不会增加ref计数器,因此通过进入方法我们正在使用共享指针,我们不知道嵌入式指针是否已被重置..我是正确的假设这个?
Class::MyFunction(std::shared_ptr<foo> &sp)
{
...
sp->do_something();
...
}
答案 0 :(得分:42)
你必须考虑std::shared_ptr
总体上仍然是一个指针(封装在像类这样的指针中)并且它确实可以be constructed to internally be nullptr
。当发生这种情况时,表达式如下:
ptr->
*ptr
导致未定义的行为。所以,是的,如果您希望指针也是nullptr
,那么您应check for its value使用:
ptr != nullptr
或
!ptr
(感谢operator bool)。
答案 1 :(得分:16)
大多数共享指针与此中的普通指针完全相同 尊重。你必须检查null。取决于 功能,你可能想切换到使用
void myFunction( Foo const& foo );
,并通过取消引用指针(推送指针)来调用它 确保指针不为null的责任 呼叫者)。
此外,使功能成为可能是不好的做法 共享指针,除非有一些特殊的所有权 涉及语义。如果该功能只是要使用 函数持续时间的指针,既不改变它也不改变它 取得所有权,原始指针可能更合适, 因为它对呼叫者施加的限制较少。 (但是这个 真的很大程度上取决于功能的作用以及你的原因 使用共享指针。当然,事实就是你 传递一个非const引用到共享指针假设 你要修改它,所以传递共享指针可能是 合适的。)
最后,共享指针的不同实现使它成为可能
或多或少难以检查null。使用C ++ 11,您可以
使用std::shared_ptr
,然后将其与nullptr
进行比较
当然,正如你所期望的那样。 Boost实现有点
然而,在这方面打破了;你不能只是比较它
0
或NULL
。你必须要构造一个空的
boost::shared_ptr
用于比较,或者在其上调用get
将生成的原始指针与0
或NULL
进行比较。
答案 2 :(得分:4)
将shared_ptr作为参考传递是没有意义的。
您可以通过boost::shared_ptr<T>.get()
获取内部对象并检查nullptr
也相关:转到标准:)
修改:这是实施:http://www.boost.org/doc/libs/1_55_0/boost/smart_ptr/shared_ptr.hpp 这是一个关于ref或没有ref的SO线程:Should I pass a shared_ptr by reference?
它在Cx11时使用移动语义,并且复制两个int,否则比传递引用要慢但是在这个优化级别上何时有人?
答案 3 :(得分:2)
这个问题没有一般答案。你必须像对待任何其他指针一样对待它。如果您不知道它是否为null,请进行测试。如果您认为它永远不会为空,assert()
它不为空并直接使用它。
您引用shared_ptr
,或者您拥有shared_ptr
这一事实对此没有任何影响。