检查 std::shared_ptr 中的空值

Check for null in std::shared_ptr

本文关键字:ptr 空值 std shared 检查      更新时间:2023-10-16

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

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

你必须考虑到std::shared_ptr总体上仍然是一个指针(封装在类似类的指针中),并且它确实可以构造为内部nullptr。发生这种情况时,表达式如下:

ptr->
*ptr

导致未定义的行为。所以,是的,如果你希望指针也是nullptr,那么你应该用以下命令检查它的值:

ptr != nullptr

!ptr

(感谢它的运算符布尔值)。

大多数共享指针与普通指针完全相同 尊。 您必须检查空值。 取决于 功能,您可能想切换到使用

void myFunction( Foo const& foo );

,并通过取消引用指针来调用它(这会推动 负责确保指针不为 null 来电者)。

此外,使函数采取 共享指针,除非有一些特殊的所有权 涉及语义。 如果函数只是要使用 函数持续时间的指针,既不更改它或 拥有所有权,原始指针可能更合适, 因为它对调用方施加的约束较少。 (但是这个 实际上很大程度上取决于函数的作用,以及您为什么 使用共享指针。 当然,事实上你已经 传递对共享指针的非常量引用假定 您将修改它,因此传递共享指针可能是 适当。

最后,共享指针的不同实现使它 检查空值或多或少很困难。 使用 C++11,您可以 使用std::shared_ptr,并将其与nullptr进行比较 自然,正如你所期望的那样。 Boost实现有点 然而,在这方面有所突破;你不能只是把它与0NULL. 您必须构造一个空的boost::shared_ptr进行比较,或致电get将生成的原始指针与0NULL进行比较。

传递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 线程:我应该通过引用传递shared_ptr吗?

它在 Cx11 时使用移动语义并复制两个整数,否则这比传递引用慢,但什么时候有人处于这种优化级别?

这个问题没有一般的答案。您必须像对待任何其他指针一样对待它。如果不知道它是否为 null,请进行测试。如果您认为它永远不会为空,assert()它不是空的并直接使用它。

事实上,你有一个对shared_ptr的引用,甚至你有一个shared_ptr,在这里没有影响。