问题解决:shared_ptr Assertion px != 0 failed及debug经验分享
问题详细描述:
/usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference::type boost::shared_ptr::operator*() const [with T = pcl::PointCloudpcl::pointxyz; typename boost::detail::sp_dereference::type = pcl::PointCloudpcl::pointxyz&]: Assertion `px != 0’ failed. Aborted (core dumped)
问题原因:
在使用boost::shared_ptr之前未进行初始化或者未正确初始化
错误代码示例:
class Listener
{
public:#在这里使用cloud_passthrough时未正确初始化pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_passthrough;void callback(const sensor_msgs::PointCloud2ConstPtr& kinect_output);};
// end classvoid Listener::callback(const sensor_msgs::PointCloud2ConstPtr& kinect_output)
{
pcl::PCLPointCloud2::Ptr pc2 (new pcl::PCLPointCloud2());pcl_conversions::toPCL (*kinect_output, *pc2);pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());pcl::VoxelGrid<pcl::PCLPointCloud2> sor;sor.setInputCloud (pc2);sor.setLeafSize(0.01f,0.01f,0.01f);sor.filter(*cloud_filtered);// filter the point cloudpcl::PointCloud<pcl::PointXYZ>::Ptr cloudXYZ (new pcl::PointCloud<pcl::PointXYZ>);//object cloud for point cloud type XYZpcl::fromPCLPointCloud2(*cloud_filtered,*cloudXYZ);//create passthrough filter objectpcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud (cloudXYZ);pass.setFilterFieldName("z");pass.setFilterLimits(0.5, 1.5);pass.filter(*cloud_passthrough);
}int main (int argc, char **argv)
{
ros::init (argc, argv, "PointCloud2_to_pointCloudXYZ");ros::NodeHandle nh;Listener listener;ros::Publisher pub = nh.advertise<pcl::PointCloud<pcl::PointXYZ> >("/filtered", 1000);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);cloud -> points = listener.cloud_passthrough->points;ros::Rate loop_rate(10); ros::Subscriber sub = nh.subscribe <sensor_msgs::PointCloud2> ("/camera/depth/points",1000,&Listener::callback, &listener);while (ros::ok()){
pub.publish (cloud);ros::spinOnce();loop_rate.sleep();}//end while loop return 0;
}//end main
正确初始化示例:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_passthrough(new pcl::PointCloud<pcl::PointXYZ>);
boost::shared_ptr<Obj> obj;
obj->Something(); // assertion failedboost::shared_ptr<Obj> obj(new Obj);
obj->Something(); // ok