问题 测试shared_ptr是否为NULL


我有以下代码片段:

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;

9122
2017-08-07 20:02


起源



答案:


是的,您正在测试它。

但是,您的问题可能是由解除引用无效的迭代器引起的。检查一下 returnsAnIterator() 总是返回一个不是的迭代器 vector.end() 并且矢量不会在两者之间修改,或者为空。


7
2017-08-07 20:08



迭代器是 vector.begin(),显然我正在测试错误的东西。谢谢你的帮助。 - Max


答案:


是的,您正在测试它。

但是,您的问题可能是由解除引用无效的迭代器引起的。检查一下 returnsAnIterator() 总是返回一个不是的迭代器 vector.end() 并且矢量不会在两者之间修改,或者为空。


7
2017-08-07 20:08



迭代器是 vector.begin(),显然我正在测试错误的东西。谢谢你的帮助。 - Max


是的,您上面的代码是正确的。 shared_ptr 可以隐式转换为bool来检查null-ness。

你遇到的问题是你的问题 returnAnIterator() 函数返回一个无效的迭代器。可能它正在回归 end() 对于一些容器,这是一个 过去 容器的末端,因此不能像你一样被解除引用 *it


8
2017-08-07 20:09