当std::cout时,本征3.3.7段故障



描述

我正在用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平台上失败了,如上所述。

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后面的句子,就像newdelete必须相同一样,以确保程序正确。

  • 没有相应pop的pragma pack(push(导致堆栈粉碎
  • https://gitlab.com/libeigen/eigen/-/issues/2074

相关内容

  • 没有找到相关文章

最新更新