2012-05-12 19 views
0

実際に構造体/クラスのコンストラクタでベクトルを初期化しようとしています。構造体/クラス内のベクトルの初期化と出力

以下の内容はエラーなしでコンパイルされますが、ベクターの内容は出力されません。私はなぜ、助けが間違いなく評価されるのか知りたいです!

struct MyInt 
{ 
friend ostream &operator<<(ostream &printout, const MyInt &Qn) 
{ 
    printout<< Qn.value << endl; 
    return printout; 
} 

    int value; 
    MyInt (int value) : value (value) {} 
}; 

struct MyStuff 
{ 
    std::vector<MyInt> values; 

MyStuff() : values() 
    { 
     values.reserve (10); // Reserve memory not to allocate it 10 times... 
    } 
}; 

int main() 
{ 
MyStuff *mystuff1; 
MyStuff *mystuff2; 

for (int i = 0; i < 10; ++i) 
{ 
     mystuff1->values.push_back (MyInt (i)); 
} 

for (int x = 0; x < 5; ++x) 
{ 
     mystuff2->values.push_back (MyInt (x)); 
} 

vector<MyInt>::iterator VITER; 

for (VITER =mystuff1->values.begin(); VITER!=mystuff1->values.end(); ++VITER) 
{ 
    cout<< *VITER; 
} 

return 0; 
} 

答えて

2

未定義の動作です。ポインタが無効です。あなたがすべてでここにポインタを必要としないので、単に値と行く:

MyStuff mystuff1, mystuff2; 

// ... 
mystuff1.push_back(...); // et cetera 

をまた、あなたが予約しない場合、それはまだ10回を割り当てません。 vectorの実装は、毎回容量を1増加させないほどスマートです。

+0

興味深いことに、これはクラッシュしませんでした。おそらくコンパイラはコードを到達不能として扱い、すべてを削除したでしょうか? – usr

+0

@usr:動作は未定義です。たぶん月が正しい位置にあるときにクラッシュするでしょう。 –

+0

もちろん、実装はこのように動作しますか?面白い。 – usr

関連する問題