问题:
/usr/include/boost/smart_ptr/shared_ptr.hpp:728: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = pcl::PointCloud<pcl::PointXYZ>; typename boost::detail::sp_dereference<T>::type = pcl::PointCloud<pcl::PointXYZ>&]: Assertion `px != 0' failed.
原因:
智能指针,使用boost::shared_ptr之前未进行初始化或者未正确初始化
如:定义如下,使用智能指针ptr定义的变量clout_out前未进行初始化或者未正确初始化。
pcl::PointCloud<pcl::PointXYZ>::Ptr clout_out;
解决:
使用变量前要先初始化,如下:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);
智能指针note:
boost::shared_ptr<Obj> obj;
obj->Something(); // assertion failedboost::shared_ptr<Obj> obj(new Obj);
obj->Something(); // ok
注意:
pcl::PointCloud<point>.makeshared()返回的是一个对当前点云深度复制后的对象的智能指针
即:
pcl::PointCloud<point> cloud;
pcl::PointCloud<point>::Ptr p= cloud.makeshared();
p并不指向cloud的空间,而是先深度拷贝了cloud放在新空间,然后返回指向该空间的指针。
通过p来操作点云,cloud不会改变。
所以用pcl定义点云的时候用:pcl::PointCloud<point>::Ptr p(new pcl::PointCloud<point>)
这样,传指针减少开销,还不会因为在传指针的时候因为makeshared被坑。。