2017-03-23 7 views
0

ここでのコードは単純です:なぜpush_backの後に間違っていますか?

int main() { 
    vector<string> v; 
    v.push_back("hello"); 
    string& x = v[0]; 
    v.push_back("world"); 
    cout << x << endl; 
    return 0; 
} 

なぜランタイムエラーはありますか?詳細に説明してください。

+6

[std :: vector :: push_back](http://en.cppreference.com/w/cpp/container/vector/push_back)のドキュメントによれば(あなたはそれを見ましたか?):_If新しい 'size()'が 'capacity()'より大きい場合、すべてのイテレータと**参照**(過去のイテレータを含む)は無効になります。さもなければ、過去のイテレータだけが無効になります._(強調するマイン) –

答えて

13

参照先はstd::vector::push_backです。

を新しいsize()が、その後(過去エンドイテレータを含む)すべてのイテレータと参照が無効化されているcapacity()よりも大きい場合:言う具体的に一部。それ以外の場合は、過去のイテレータのみが無効になります。

2番目の文字列をベクトルにプッシュバックすると、2番目の文字列に十分な容量がないため、メモリを再割り当てする必要があるようです。この再割り当てによって、ベクトルデータ全体がメモリ内の他の場所に移動されました。したがって、その最初の文字列への参照はぶら下がり参照になり、逆参照は未定義の動作をします。

関連する問題