【问题标题】:testing if a shared_ptr is NULL测试 shared_ptr 是否为 NULL
【发布时间】:2010-08-07 20:02:39
【问题描述】:

我有以下代码sn-p:

std::vector< boost::shared_ptr<Foo> >::iterator it;
it = returnsAnIterator();
// often, it will point to a shared_ptr that is NULL, and I want to test for that
if(*it)
{
    // do stuff
}
else // do other stuff

我的测试是否正确? boost 文档说 shared_ptr 可以隐式转换为 bool,但是当我运行此代码时,它会出现段错误:

Program received signal SIGSEGV, Segmentation fault.
0x0806c252 in boost::shared_ptr<Foo>::operator Foo*
boost::shared_ptr<Foo>::* (this=0x0)
    at /usr/local/bin/boost_1_43_0/boost/smart_ptr/detail/operator_bool.hpp:47
47              return px == 0? 0: &this_type::px;

【问题讨论】:

    标签: c++ null shared-ptr


    【解决方案1】:

    是的,您上面的代码是正确的。 shared_ptr 可以隐式转换为布尔值以检查是否为空。

    您遇到的问题是您的 returnAnIterator() 函数正在返回一个无效的迭代器。可能它正在为某个容器返回end(),它是容器末尾的一个过去,因此不能像您对*it 所做的那样取消引用。

    【讨论】:

      【解决方案2】:

      是的,您正在正确地测试它。

      但是,您的问题可能是由取消引用无效迭代器引起的。检查returnsAnIterator() 始终返回不是vector.end() 的迭代器,并且向量之间没有修改,或者为空。

      【讨论】:

      • 迭代器是vector.begin(),所以显然我在测试错误的东西。感谢您的帮助。
      猜你喜欢
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多