0

今日、興味深いことを学びました: 標準ベクトル v があり、次のようなコードを実行した場合:

std::vector<float> v;
for (int i = 0; i < 2; i++) v.push_back(2.);

を呼び出しても、境界チェックを行わないv[2]ため、セグメンテーション違反は発生しません。operator[]私はとてつもなく小さな数を取得していましたが、push_back のデフォルトの動作とは何か、ベクトル境界のオーバーフローから何を期待すべきかについて興味がありました。次のフロートだけでなく、より多くのスペースを割り当てる必要があると思います。いくら?これは標準ですか、それともコンパイラ固有ですか?

4

2 に答える 2

3

今日は面白いことを学びました

それでは、さらに興味深いことを学びましょう。添字演算子を使用するための前提条件は、インデックスがベクトルのサイズよりも小さいことであるため、コードにはUndefined Behaviorがあります。

C++11 標準の表 101 によると、式a[n]は と同等*(a.begin() + n)です。v.begin() + 2はコンテナの末尾を超えた位置へのイテレータであるため、v逆参照すると未定義の動作が発生します。

于 2013-03-28T21:31:50.593 に答える
0

を呼び出しても、境界チェックを行わないv[2]ため、セグメンテーション違反は発生しません。operator[]

二人はこんな関係じゃないのに…

コードは未定義の動作を呼び出すため、何でもできます

于 2013-03-28T21:31:42.333 に答える