我在想,在使用sp
之前是否需要检查它是否为null
。
如果我说错了,请纠正我,但创建别名不会增加引用计数器,因此进入方法时我们正在使用一个共享指针,我们不知道嵌入指针是否已被重置.. 我正确地假设了吗?
Class::MyFunction(std::shared_ptr<foo> &sp)
{
...
sp->do_something();
...
}
我在想,在使用sp
之前是否需要检查它是否为null
。
如果我说错了,请纠正我,但创建别名不会增加引用计数器,因此进入方法时我们正在使用一个共享指针,我们不知道嵌入指针是否已被重置.. 我正确地假设了吗?
Class::MyFunction(std::shared_ptr<foo> &sp)
{
...
sp->do_something();
...
}
你需要考虑到std::shared_ptr
本质上仍然是一个指针(封装在类似指针的类中),它确实可以被构造为内部为nullptr
。当这种情况发生时,如下表达式:
ptr->
*ptr
导致未定义的行为。所以,是的,如果你期望指针也是nullptr
,那么你应该使用以下方式检查其值:
ptr != nullptr
或者
!ptr
!ptr
。它存在的原因是为了模拟裸指针,但这是从C继承来的一个缺陷,在编写良好的代码中应该避免使用它(即使在C中也是如此)。 - James Kanzenullptr
或0
的值在布尔上下文中都会被解释为false。这是完全正常的。否则,你需要在各个地方编写if (someValue == 0)
和if (somePointer == nullptr)
。按照你的逻辑,你必须写if (someBoolean == false)
而不是if (!someBoolean)
对吗?但是等等,那么你就需要写if ((someBoolean == false) == true)
,否则我猜这就是“混淆”了吧? - ThreeStarProgrammer57大多数共享指针在这方面与普通指针完全相同。您必须检查是否为null。根据函数,您可能希望切换到使用
void myFunction( Foo const& foo );
通过对指针进行取消引用操作来调用它(这将把确保指针不为null的责任推给调用者)。
此外,除非有特殊的所有权语义涉及,否则使函数接受一个shared_ptr可能是不好的实践。如果函数只是在函数执行期间使用指针,而不会更改它或拥有它,则原始指针可能更合适,因为它对调用者施加的约束较少。(但这实际上取决于函数的行为以及您为什么使用共享指针。当然,传递非const引用到共享指针的事实意味着您将要修改它,因此传递共享指针可能是合适的。)
最后,不同的共享指针实现使检查空值更或少困难。使用C++11,您可以使用std::shared_ptr
自然地将其与nullptr
进行比较,就像您期望的那样。然而,Boost实现在这方面有些问题;您不能将它与0
或NULL
直接比较。您必须为比较构造一个空的boost::shared_ptr
,或者调用get
并将得到的原始指针与0
或NULL
进行比较。
boost::shared_ptr<T>.get()
获取内部对象并检查nullptr
。
同样相关:移动到std :)
编辑:这是实现:http://www.boost.org/doc/libs/1_55_0/boost/smart_ptr/shared_ptr.hpp
这里有一个关于是否使用引用的SO线程:Should I pass a shared_ptr by reference?
当Cx11时使用移动语义,否则复制两个int,这比传递引用慢,但是什么时候会有人在这个优化级别上呢?get()
来检查空值。 - Angew is no longer proud of SOboost::shared_ptr
时,你需要使用get
,或者你需要构造一个空的boost::shared_ptr
进行比较,或者你需要使用混淆的隐式转换。使用get
可能是最好的(或最不坏的)解决方案。 - James Kanzeassert()
它不为空并直接使用它。shared_ptr
的引用或者 shared_ptr
本身对此没有影响。