视觉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> poses; // 相机位姿
vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> poses; // 地址对齐