C++ 在std::shared\u ptr中检查null
我想知道在使用之前是否需要检查C++ 在std::shared\u ptr中检查null,c++,shared-ptr,C++,Shared Ptr,我想知道在使用之前是否需要检查sp是否为null。 如果我错了,请纠正我的错误,但创建别名不会增加ref计数器,因此通过输入我们正在使用的共享指针的方法,我们不知道嵌入指针之前是否已重置。。我的假设正确吗 Class::MyFunction(std::shared_ptr<foo> &sp) { ... sp->do_something(); ... } Class::MyFunction(std::shared_ptr&s
sp
是否为null
。
如果我错了,请纠正我的错误,但创建别名不会增加ref计数器,因此通过输入我们正在使用的共享指针的方法,我们不知道嵌入指针之前是否已重置。。我的假设正确吗
Class::MyFunction(std::shared_ptr<foo> &sp)
{
...
sp->do_something();
...
}
Class::MyFunction(std::shared_ptr&sp)
{
...
sp->do_something();
...
}
这个问题没有一般的答案。你必须像对待其他指针一样对待它。如果您不知道它是否为空,请进行测试。如果您相信它永远不会为null,assert()
确认它不为null并直接使用它
您引用了
shared\u ptr
,甚至您拥有shared\u ptr
,这一事实在这里没有任何影响。将shared\u ptr作为引用是没有意义的
您可以通过boost::shared_ptr.get()
获取内部对象,并检查nullptr
同样相关:移至标准:)
编辑:这是实现:
这里有一个关于ref或no ref的SO线程:
在CX11中使用移动语义并复制两个int,否则它比通过引用慢,但当这个优化级别有人时,
您必须考虑到,总体上还是一个指针(封装在指针类中),它确实可以。出现这种情况时,表达式如下:ptr->
*ptr
导致未定义的行为。因此,是的,如果您希望指针也为nullptr
,那么您应该:
或
(多亏了its)。大多数共享指针与本系统中的普通指针完全相同 尊敬。您必须检查空值。取决于 函数,您可能希望切换到使用
void myFunction( Foo const& foo );
,并通过取消引用指针(推动
负责确保指向
来电者)
另外,让函数执行可能是不好的做法
共享指针,除非有特殊所有权
涉及语义。如果函数只是要使用
函数持续时间的指针,既不更改也不更改
拥有所有权时,原始指针可能更合适,
因为它对调用者施加的约束较少。(但是这个
这在很大程度上取决于函数的作用,以及您为什么要这样做
使用共享指针。当然,事实上
将非常量引用传递给共享指针假定
您将对其进行修改,因此传递共享指针可能是错误的
)
最后,共享指针的不同实现使得
检查空值或多或少有点困难。使用C++11,您可以
使用std::shared_ptr
,只需将其与nullptr
当然,正如你所料。Boost实现有点复杂
然而,在这方面却有缺陷;你不能只是把它和
0
或NULL
。您必须构造一个空的
boost::shared_ptr
进行比较,或者调用get
,然后
将生成的原始指针与
0
或NULL
进行比较,您认为没有意义是什么意思?我们对函数的作用知之甚少。您不需要get()
来检查null。智能指针的整个设计理念是快速复制。在Cx11中,它使用移动语义,在此之前,它基本上复制两个int,如shared_ptr实现中所述。这实际上不应该影响性能。如果没有.get(),空值测试应该是可能的。你是对的。“将共享的\u ptr作为引用传递是没有意义的。”—[需要引用]。您可以通过常量引用(即“确保模块的API不影响值”)或通过引用(即“将其视为输出变量”)传递。传递(const)引用可能是由编码约定、技术原因(“模板专用化接收参数作为const引用”)等强制要求的。@utnapistim这个问题以前被问过:@Angew Withboost::shared\u ptr
,您需要get
,或者您需要构造一个空的boost::shared_ptr
来进行比较,或者您需要使用模糊隐式转换。使用get
可能是最好(或最不坏)的解决方案。@Jeffrey,除了!ptr必须避免,除非你的目标是混淆。它是模拟原始指针的,但这是原始指针的错误特征,继承了C,并且应该在良好的代码中避免(甚至在C中)。@ JamesKanze C和C++都部分地假设“代码> 0=false <代码>,这是遍及整个地方,你不能回避它,更不用说远离它了。这个关联被刻在我的程序员大脑中,即使我很久没有接触C,我想很多其他C++程序员也有这种感觉。*PTR和PTR>相当于:*GET()和GET()。这不是未定义的,为什么你说它是未定义的?@epiroks我想OP的意思是,当托管指针为null时,它是未定义的行为。不管智能指针是什么,取消对null的引用都不是定义的行为。@Bathsheba:只有当他能使用C++11时。并不是每个人都是业余程序员,可以控制自己的工具链。@LightnessRacesinOrbit:的确(我承认,在对冲基金工作是一种爱好),但培养必要的个人效能技能以推动公司向前发展是很重要的。@Bathsheba:我同意:至少在你自己的时间写出来,是的!
!ptr
void myFunction( Foo const& foo );