0

我有以下代码:

#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(),它可以工作,没有段错误。
  • 如果我取消注释vin的声明States并注释 C++11 样式的初始化,然后v.resize(2); v << 1, 1;在构造函数中使用,它可以工作
  • 如果我使用-O2-O3优化,它可以工作。
  • 在我测试过的所有其他平台(Ubuntu 14.04、Debian7、OS X 10.10)上,无论优化级别如何,它都能正常工作
  • 这个问题似乎只出现在 Solaris 上,没有优化,在 g++4.9 下

我的问题如下:

  1. 我写的代码正确吗?也就是说,我可以安全地使用C++11-style 类内初始化,还是应该只声明向量然后在构造函数中调整它的大小?

  2. 如果我的代码是正确的,有没有人遇到过这个问题?(我知道这极不可能,但我仍然问:))

PS:我使用 Eigen 3.2.2(虽然问题也出现在 3.2.1 上)

如果有人能告诉我是否可以在 Solaris11 上构建/运行程序,我将不胜感激(无论编译器如何)

4

0 回答 0