最小可重现错误:
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; 但是由于某种原因,此时的"步骤"将控制权带回已经解除分配的前一行(通常是任何 Cloud::P tr 声明)。我不确定这是因为它超出了范围,还是因为智能指针在到达返回时删除了它们,或者这些知识是否会帮助我。赛段错误是一个双重释放错误。我相信它被取消分配是因为它超出了范围,然后智能指针正在尝试清理。我在这里错过了什么?为什么会这样?我怎样才能避免这种情况?如果你不能回答这个问题,有没有办法知道一个对象什么时候被解除分配(运行什么代码来解除分配)?我确保编译器优化处于关闭状态,以确保代码线性运行。
可能正在发生的事情是cloud_cut
被破坏了两次。
此行在堆栈上分配cloud_cut
,当 main 函数返回时,它将被销毁:
pcl::PointCloud<pcl::PointXYZRGB> cloud_cut;
同样,当这个智能指针被破坏时,它也将触发它所指向的对象的破坏:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr floor_cut(&cloud_cut)
因此,首先在堆上构造对象。