视觉SLAM十四讲 报错ch12/pointcloud_mapping: segmentation fault core dumped ./pointcloud_mapping
1. 问题
编译高博的视觉SLAM十四讲ch12的./pointcloud_mapping 没有问题,但是运行的时候出现错误:
$ ./pointcloud_mapping
[1] 863 segmentation fault (core dumped) ./pointcloud_mapping
2. 原因
segmentation fault 即段错误,常常在访问不可访问的内存或越界时出现,更多的原因。在这里,问题出在Eigen,也就是代码./pointcloud_mapping 中的:
vector<Eigen::Isometry3d> poses;
我们知道EIGEN是非常强大的C++矩阵运算库,为了加速运算,Eigen运用了SSE、AVX等指令集进行向量化加速。而加速运算需要对数据进行对齐(详情参考知乎,写的很好,涉及到内存申请、指针对齐等),C++的STL比如std::vector 在没有重写的情况下,使用默认的动态内存申请,使得类似于std::vector<Eigen::Vector3d> 申请的地址没有对齐,从而无法进行加速运算,报错。 更详细的解释可以看看这两篇博文,写的很好,看完可以对Eigen有更深的理解: https://zhuanlan.zhihu.com/p/93824687 https://blog.csdn.net/derteanoo/article/details/83303760
3. 解决方案
利用Eigen中的Eigen::aligned_allocator 使得STL申请内存时内存对齐:
vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> poses;
|