次のコードがあります。
#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 を使用) でプロジェクトを最適化せずにビルドすると、実行時に segfault (コア ダンプ) が発生します。掘り下げて段階的なデバッグを行った後、問題のある行は
DenseCoeffBase.h
function 内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()
と、機能し、segfault は発生しません。 v
inの宣言をコメント解除しStates
、C++ 11 スタイルの初期化をコメント化してからv.resize(2); v << 1, 1;
、コンストラクター内で使用すると、機能します-O2
または-O3
最適化を使用すると、機能します。- 私がテストした他のすべてのプラットフォーム (Ubuntu 14.04、Debian7、OS X 10.10) では、最適化レベルに関係なく動作します
- この問題は、g++4.9 の下で、最適化されていない Solaris でのみ発生するようです。
私が持っている質問は次のとおりです。
私が書いたコードは正しいですか?つまり、クラス内の初期化スタイルを安全に使用でき
C++11
ますか、それともベクトルを宣言してからコンストラクターでサイズを変更する必要がありますか?私のコードが正しい場合、誰かがこの問題に遭遇しましたか? (私はそれが非常にありそうもないことを知っていますが、それでも私は尋ねます:))
PS: 私は Eigen 3.2.2 を使用しています (ただし、この問題は 3.2.1 でも発生します)
Solaris11でプログラムをビルド/実行できるかどうか教えていただければ幸いです(コンパイラに関係なく)