使用PointCloudLibrary混淆segFault跟踪

时间:2015-04-15 17:34:24

标签: c++ segmentation-fault gdb point-cloud-library

最小可重现错误:

    int main( int argc, char**  argv)
{  //std::cout << "initial area_seg" << std::endl;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>() );
    if (pcl::io::loadPCDFile<pcl::PointXYZRGB> (argv[1], *cloud) == -1){   
      PCL_ERROR ("Couldn't read the input file \n");
      return (-1);
    }   

  std::cout << "floor cloud" << std::endl;
    pcl::PointCloud<pcl::PointXYZRGB> cloud_cut; 
//custom void func that takes cloud in, and returns(by reference) cloud_cut
    area_seg(-5,5,.15,5,-5,5,cloud, cloud_cut, "null");
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr floor_cut(&cloud_cut);//Fault HERE

    return 0;
}

根据使用GBD的跟踪,命令达到返回0;但后来由于某种原因&#39; step&#39;此时将控制权交还给已经解除分配的前一行(通常是任何Cloud :: Ptr声明)。我不确定这是因为它超出了范围,还是因为智能指针在达到返回时删除了它们,或者这些知识对我有帮助。 segFault是一个双重免费错误。我相信它正在被处理,因为它超出范围,然后智能指针试图清理。 我在这里错过了什么?为什么会这样?我怎么能避免这个?如果你不能回答这个问题,有没有办法告诉对象何时被解除分配(运行什么代码才能解决)? 我确保关闭编译器优化,以确保代码线性运行。

1 个答案:

答案 0 :(得分:1)

可能发生的事情是cloud_cut被毁了两次。

这一行在堆栈上分配cloud_cut,当main函数返回时它将被破坏:

pcl::PointCloud<pcl::PointXYZRGB> cloud_cut; 

类似地,当这个智能指针被破坏时,它也会触发它所指向的对象的破坏:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr floor_cut(&cloud_cut)

相反,首先在堆上构造对象。