std::cout 时的 eigen3.3.7 段错误
eigen3.3.7 segment fault when std::cout
描述
我正在用 Eigen 编写玩具代码。但是当我尝试打印矩阵时,不幸的是,我在 cout 时遇到了段错误。下面第一段代码是我遇到segmentation fault的项目代码。我知道如果我只写一小段代码作为第二段代码,它就可以正常工作。所以我不知道我的项目代码有什么问题,如图所示,它在 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不进行内存对齐
当我删除这段代码时,一切正常。有人对这个错误有任何想法吗?
更多关于这个
与 #pragma pack(1)
相同的代码可以 运行 在 arm 上,但如上所述在 x86 平台上失败。
x86
- OS Linux wang-X556UQK 5.4.0-54-generic #60-Ubuntu SMP 11 月 6 日星期五 10:37:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- ubuntu 20.04 版本
- gcc Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
- 本征 3.3.7
手臂
- OS Linux iTOP4412-ubuntu-desktop 3.0.15 #20 SMP PREEMPT 3 月 31 日星期二 22:03:51 CST 2020 armv7l 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
必须一样才能确保程序正确。
描述
我正在用 Eigen 编写玩具代码。但是当我尝试打印矩阵时,不幸的是,我在 cout 时遇到了段错误。下面第一段代码是我遇到segmentation fault的项目代码。我知道如果我只写一小段代码作为第二段代码,它就可以正常工作。所以我不知道我的项目代码有什么问题,如图所示,它在 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不进行内存对齐
当我删除这段代码时,一切正常。有人对这个错误有任何想法吗?
更多关于这个
与 #pragma pack(1)
相同的代码可以 运行 在 arm 上,但如上所述在 x86 平台上失败。
- OS Linux wang-X556UQK 5.4.0-54-generic #60-Ubuntu SMP 11 月 6 日星期五 10:37:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- ubuntu 20.04 版本
- gcc Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
- 本征 3.3.7
- OS Linux iTOP4412-ubuntu-desktop 3.0.15 #20 SMP PREEMPT 3 月 31 日星期二 22:03:51 CST 2020 armv7l 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
必须一样才能确保程序正确。