Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在std::shared\u ptr中检查null_C++_Shared Ptr - Fatal编程技术网

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 With
boost::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 );