次のプログラムは、セグメンテーション違反でクラッシュします。
#include <iostream>
#include <vector>
using namespace std;
struct data
{
data() : a(random()), b(random()), v({random(), random(), random()}) {}
data(data&& m) noexcept : a(m.a), b(m.b), v(std::move(m.v)) { }
long int a;
long int b;
std::vector<long int> v;
};
data&& randomize()
{
srandom(time(0));
data d;
d.a = random();
return std::move(d);
}
int main( int argc, char** argv )
{
data d = randomize();
cout << d.a << " " << d.b << endl;
return 0;
}
コードは g++ バージョン 4.7.2 (Debian 4.7.2-5) でコンパイルされています。
g++ -std=c++11 -g test.cpp
私は何を間違っていますか?問題は std::vector 移動コンストラクターにあるようです。これがなくてもすべて正常に動作します。関数の終了時に randomize() からのデータ オブジェクトが破棄されているように見えますが、最初にメインのデータ オブジェクトに移動するべきではありませんか?