在std :: shared_ptr中检查null

时间:2014-03-06 09:42:31

标签: c++ shared-ptr

我想知道在使用之前是否需要检查sp是否为null。 纠正我,如果我错了,但创建一个别名不会增加ref计数器,因此通过进入方法我们正在使用共享指针,我们不知道嵌入式指针是否已被重置..我是正确的假设这个?

Class::MyFunction(std::shared_ptr<foo> &sp)
{    
    ...  
    sp->do_something();  
    ...  
}

4 个答案:

答案 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实现有点 然而,在这方面打破了;你不能只是比较它 0NULL。你必须要构造一个空的 boost::shared_ptr用于比较,或者在其上调用get 将生成的原始指针与0NULL进行比较。

答案 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这一事实对此没有任何影响。