我有以下代码:
#include <Eigen/Dense>
struct States
{
// Eigen::VectorXd v;
Eigen::VectorXd v{Eigen::VectorXd::Ones(2)};
States() {
// v.resize(2);
// v << 1, 1;
}
};
States st;
int main() {}
每当我在 Solaris 11(使用 g++4.9)下构建项目时,没有进行任何优化,运行时都会出现段错误(核心转储)。经过一番挖掘和逐步调试后,我认为故障线在
DenseCoeffBase.h
,内部功能copyPacket
,即线537
derived().template writePacket<StoreMode>(index,
other.derived().template packet<LoadMode>(index));
我用来编译/运行的命令行:g++ -std=c++11 -I ./eigen_3.2.2 example.cpp; ./a.out
一些备注:
- 如果我将声明移到
States st;
里面main()
,它可以工作,没有段错误。 - 如果我取消注释
v
in的声明States
并注释 C++11 样式的初始化,然后v.resize(2); v << 1, 1;
在构造函数中使用,它可以工作 - 如果我使用
-O2
或-O3
优化,它可以工作。 - 在我测试过的所有其他平台(Ubuntu 14.04、Debian7、OS X 10.10)上,无论优化级别如何,它都能正常工作
- 这个问题似乎只出现在 Solaris 上,没有优化,在 g++4.9 下
我的问题如下:
我写的代码正确吗?也就是说,我可以安全地使用
C++11
-style 类内初始化,还是应该只声明向量然后在构造函数中调整它的大小?如果我的代码是正确的,有没有人遇到过这个问题?(我知道这极不可能,但我仍然问:))
PS:我使用 Eigen 3.2.2(虽然问题也出现在 3.2.1 上)
如果有人能告诉我是否可以在 Solaris11 上构建/运行程序,我将不胜感激(无论编译器如何)