解除分配 pcl::PointCloud<pcl::PointXYZ>::Ptr 时出现分段错误
Posted
技术标签:
【中文标题】解除分配 pcl::PointCloud<pcl::PointXYZ>::Ptr 时出现分段错误【英文标题】:Segmentation fault when deallocating pcl::PointCloud<pcl::PointXYZ>::Ptr 【发布时间】:2020-07-31 08:14:08 【问题描述】:我有一个函数可以成功读取点云并将其存储在pcl::PointCloud<pcl::PointXYZ>::Ptr pcd
然后我运行
//filter the pointcloud to remove some noise while still keeping the cloud dense
pcl::PointCloud<pcl::PointXYZ>::Ptr tmp = filter_obj.filterVoxelGrid(pcd, 0.01, 0.01, 0.01);
其中filter_obj
是stereo_pointcloud_filter
的对象
pcl::PointCloud<pcl::PointXYZ>::Ptr stereo_pointcloud_filter::filterVoxelGrid(
pcl::PointCloud<pcl::PointXYZ>::Ptr inputcloud,
float voxelX, float voxelY, float voxelZ)
pcl::PointCloud<pcl::PointXYZ>::Ptr outputcloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(inputcloud);
sor.setLeafSize(voxelX, voxelY, voxelZ);
sor.filter(*outputcloud);
pcl::PointCloud<pcl::PointXYZ>::Ptr result(outputcloud);
return result;
我在取消分配 tmp
期间遇到分段错误。我几乎可以肯定该错误与 filterVoxelGrid()
中的一些错误指针有关,但我不确定如何解决。
这是调用堆栈
libc.so.6!__GI___libc_free(void * mem) (/usr/src/glibc/glibc-2.23/malloc/malloc.c:2951) Eigen::internal::handmade_aligned_free(void * ptr) (/home/shawn/Documents/Projects/catkin_ws/devel/include/Eigen/src/Core/util/Memory.h:98) Eigen::internal::aligned_free(void * ptr) (/home/shawn/Documents/Projects/catkin_ws/devel/include/Eigen/src/Core/util/Memory.h:179) Eigen::aligned_allocator::deallocate(Eigen::aligned_allocator * const this, Eigen::aligned_allocator::pointer p) (/home/shawn/Documents/Projects/catkin_ws/devel/include/Eigen/src/Core/util/Memory .h:755) std::allocator_traits >::deallocate(Eigen::aligned_allocator & __a, std::allocator_traits >::pointer __p, std::allocator_traits >::size_type __n) (/usr/include/c++/5/bits/alloc_traits.小时:386) std::_Vector_base >::_M_deallocate(std::_Vector_base > * const this, std::_Vector_base >::pointer __p, std::size_t __n) (/usr/include/c++/5/bits/stl_vector.h: 178) std::_Vector_base >::~_Vector_base(std::_Vector_base > * const this) (/usr/include/c++/5/bits/stl_vector.h:160) std::vector >::~vector(std::vector > * const this) (/usr/include/c++/5/bits/stl_vector.h:425) pcl::PointCloud::~PointCloud(pcl::PointCloud * const this) (/usr/local/include/pcl-1.8/pcl/point_cloud.h:240) pcl::PointCloud::~PointCloud(pcl::PointCloud * const this) (/usr/local/include/pcl-1.8/pcl/point_cloud.h:240) boost::checked_delete >(pcl::PointCloud * x) (/usr/include/boost/core/checked_delete.hpp:34) boost::detail::sp_counted_impl_p >::dispose(boost::detail::sp_counted_impl_p > * const this) (/usr/include/boost/smart_ptr/detail/sp_counted_impl.hpp:78) boost::detail::sp_counted_base::release(boost::detail::sp_counted_base * const this) (/usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146) boost::detail::shared_count::~shared_count(boost::detail::shared_count * const this) (/usr/include/boost/smart_ptr/detail/shared_count.hpp:443) boost::shared_ptr >::~shared_ptr(boost::shared_ptr > * const this) (/usr/include/boost/smart_ptr/shared_ptr.hpp:323) read_PCD_file(std::__cxx11::string pcdFilePath) (/home/shawn/Documents/Projects/catkin_ws/src/file.cpp:402) main(int argc, char ** argv) (/home/shawn/Documents/Projects/catkin_ws/src/file.cpp:567)
【问题讨论】:
当询问您遇到的错误时,请始终在您的问题中包含错误消息的逐字文本。 你可能有代码在tmp
被创建之后但在它被销毁之前破坏内存,并且只有在tmp
被销毁期间,运行时才会注意到这个问题。
如果这是 linux 代码,可能值得通过 valgrind 运行它,这可以深入了解错误是如何发生的。
@JesperJuhl 我已经添加了堆栈跟踪。我没有收到错误消息。
@Owl 我会尝试使用 valgrind 进一步找出问题
【参考方案1】:
问题出在 PCL 库的某个地方。我的机器上有几个不同版本的 PCL 版本,这可能会导致某种冲突。擦除所有内容并重新开始清除此错误。
【讨论】:
【参考方案2】:虽然我无法找到解决此问题的方法,但我找到了解决方法。我改用 pcl::PCLPointCloud2
而不是 pcl::PointCloud<pcl::PointXYZ>
并且代码工作正常。
pcl::PointCloud<pcl::PointXYZ>::Ptr stereo_pointcloud_filter::filterVoxelGrid(
pcl::PointCloud<pcl::PointXYZ>::Ptr inputcloud,
float voxelX, float voxelY, float voxelZ)
pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
pcl::toPCLPointCloud2(*inputcloud, *cloud);
pcl::PointCloud<pcl::PointXYZ>::Ptr outputcloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
// Create the filtering object
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(voxelX, voxelY, voxelZ);
sor.filter(*cloud_filtered);
pcl::fromPCLPointCloud2(*cloud_filtered, *outputcloud);
return outputcloud;
【讨论】:
以上是关于解除分配 pcl::PointCloud<pcl::PointXYZ>::Ptr 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 使用KinectGrabber / Kinect2Grabber从Kinect v1 / v2传感器检索的pcl :: PointCloud <pcl :: PointXYZRGBA