我有以下代码:
#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
取消注释States
的声明并注释C ++ 11样式的初始化,那么在构造函数中使用v.resize(2); v << 1, 1;
,它可以正常工作-O2
或-O3
优化,则可行。我的问题如下:
我写的代码是否正确?也就是说,我可以安全地使用C++11
样式的类内初始化,还是应该声明向量然后在构造函数中调整它?
如果我的代码是正确的,有没有人遇到过这个问题? (我知道这种可能性非常小,但我仍然会问:))
PS:我使用Eigen 3.2.2(虽然问题也出现在3.2.1上)
如果有人能告诉我是否可以在Solaris11上构建/运行程序(无论编译器),我将不胜感激