描述
我正在用Eigen编写一个玩具代码。但当我试图打印矩阵时,不幸的是,我在cout时遇到了分段错误。下面的第一个代码是我遇到分段错误的项目代码。我知道,如果我只写一个小代码作为第二个代码,它会很好地工作。所以我不知道我的项目代码是怎么回事,因为它在cout中失败了,正如图片所示。
C++代码
最起码的测试代码是https://godbolt.org/z/GePx5b
#pragma pack(1)
#include <iostream>
#include <Eigen/Dense>
#include <string>
#include <fstream>
#define BUFFER_SIZE 256
#define WORK_SPACE "PositioningSystem/"
using Eigen::Matrix3d;
int main(int argc, char const *argv[]) {
Eigen::Matrix3d m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m << std::endl;
return 0;
}
如果你写第一个代码#pragma pack(1)
,你会遇到分段错误,如果你删除它,一切都很好。
终于找到bug了
在一个包含文件中,我写了如下这样的代码
#pragma pack(1) //指示struct不进行内存对齐
当我删除此代码时,一切正常。有人对这个bug有什么想法吗?
关于这个的更多信息
与#pragma pack(1)
相同的代码可以在arm上运行,但在x86平台上失败了,如上所述。
- 操作系统Linux wang-X556UQK 5.4.0-54-generic#60 Ubuntu SMP 11月6日星期五上午10:37:59 UTC 2020 x86_64 x86_66 GNU/Linux
- ubuntu 20.04发布
- gcc Ubuntu 9.3.0-17ubuntu1~20.04(9.3.0
- 特征3.3.7
- OS Linux iTOP4412 ubuntu桌面3.0.15#20 SMP PREEMPT 3月31日星期二22:03:51 CST 2020 armv7l armv7l GNU/Linux
- ubuntu 12.04由供应商Linaro 12.04定制(GNU/Linux 3.0.15 armv7l(
- gcc Ubuntu/Linaro 4.6.3-1ubuntu5(4.6.3
- 特征3.0.5
是的,我终于成功地克服了这个问题。#pragma pack
出了问题。因此,请使用#pragma pop
后面的句子,就像new
和delete
必须相同一样,以确保程序正确。
- 没有相应pop的pragma pack(push(导致堆栈粉碎
- https://gitlab.com/libeigen/eigen/-/issues/2074