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
}
STLベクトルは、.at()
メンバー関数が呼び出されたときに境界チェックを実行しますが、 []
演算子のチェックは実行しません 。
範囲外の場合、[]
演算子は未定義の結果を生成します。
Kgraneyの回答で述べられているように、これは未定義の振る舞いです。ただし、ほとんどのc ++ライブラリには、中止したり、そのような場合に例外を発生させたりする機能があります。通常、特定のコンパイラマクロを設定または設定解除することによって制御されます。
関連するドキュメントの概要を説明しました。
_ SCL_SECURE_NO_WARNINGS -安全性は低くなりますが(Microsoftによると)、より標準に準拠しています:
_ SECURE_SCL -イテレータのデバッグレベルを設定する古い方法
Gnuとclangはデフォルトでチェックを無効にしますが、Microsoftはデフォルトでチェックを有効にしていることに注意してください。これに気付いていない場合、Microsoftシステムのデバッグモードではコードの実行速度が大幅に低下する可能性があります。
これは未定義の動作です。未定義の動作は、必ずしもエラーが発生することを意味するわけではありません。あなた可能性がありますですが、代わりに、あまり意味のない結果が得られる可能性があります。