检查 std::shared_ptr 中的空值
Check for null in std::shared_ptr
我想知道我是否需要在使用之前检查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实现有点 然而,在这方面有所突破;你不能只是把它与0
或NULL
. 您必须构造一个空的boost::shared_ptr
进行比较,或致电get
将生成的原始指针与0
或NULL
进行比较。
传递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
,在这里没有影响。
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 使用 const char* 键映射 C++ 检索空值
- 返回空值的字符串值
- boost::any 如何检查空值/未定义的值
- C++ - 无法从基类继承 |提供空值
- C++空值和此指针
- 使用 cin 或 getline() 输入空值
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 可变参数列表是否以空值终止?
- 如何将整数重新初始化/设置为空值
- 检查构造函数的空值
- 无法从Linux,C ++执行"my_script" python脚本"main(filename)"功能;pModule = PyImport_Import(pName);返回空值
- 使用Nlohmann JSON将JSON数据保存在文件中时获取空值
- 在命名空间中定义变量,但在测试中获取空值
- 将 CURL 转换为字符串时为空值
- QCharts - 在 QLineSeries 中创建一个中断(空值)
- 动态强制转换返回空值
- SDL 表面返回空值
- ptrA = ptrB 是否等同于 ptrA = &*ptrB?,空值是否共享一个地址空间?
- 在C++中为空 ptr 到 ptr 赋值