web-dev-qa-db-ja.com

エラーを出さずにベクトルが範囲外になる

std::vectorがあります。サイズが6であることを確認しましたが、vec[6]にアクセスしてエラーが発生するかどうかを確認しようとすると、エラーは発生しませんが、代わりにいくつかの数値が表示されます。エラーが発生するべきではありませんか?

編集:次のようなもの:

struct Element
{
    std::vector<double> face;
};

int main()
{
    Element Elm;

    .... // insert 6 elements into Elm.face

    std::cout << Elm.face.size() << std::endl; // answer is 6
    std::cout << Elm.face[6] << std::endl; // answer is some number
}
17
Shibli

STLベクトルは、.at()メンバー関数が呼び出されたときに境界チェックを実行しますが、 []演算子のチェックは実行しません

範囲外の場合、[]演算子は未定義の結果を生成します。

38
kgraney

Kgraneyの回答で述べられているように、これは未定義の振る舞いです。ただし、ほとんどのc ++ライブラリには、中止したり、そのような場合に例外を発生させたりする機能があります。通常、特定のコンパイラマクロを設定または設定解除することによって制御されます。

関連するドキュメントの概要を説明しました。

gnu libstdc ++

clang libcxx

ブースト

マイクロソフト

Gnuとclangはデフォルトでチェックを無効にしますが、Microsoftはデフォルトでチェックを有効にしていることに注意してください。これに気付いていない場合、Microsoftシステムのデバッグモードではコードの実行速度が大幅に低下する可能性があります。

9

これは未定義の動作です。未定義の動作は、必ずしもエラーが発生することを意味するわけではありません。あなた可能性がありますですが、代わりに、あまり意味のない結果が得られる可能性があります。

3
icktoofay