は、G ++でこのコード私のシステムでは誤ったstd :: vectorアクセス呼び出しがプログラムを終了し、有用なエラーメッセージを表示するようにコンパイルすることはできますか?
#include <vector>
#include <iostream>
main()
{
std::vector <int> x(1);
for(int q=0;; q++)
{
int y = x[q];
std::cout << q << " ";
}
}
を考えてみましょう、これはSegmentation fault (core dumped)
でクラッシュする前に32570まで出力します。おそらく、〜32570は、OSやアロケータがベクトルに割り当てようとする最小のメモリチャンクのサイズなので、長い時間がかかります。しかし、もちろん、これまでのような操作を行うたびに、配列の最後は通常バグです。これが起こるときはいつでも有用なエラーメッセージでプログラムを終了させることができればいいです。
数年前、Xcodeで、std::vector
のタイプ(および名前?)で終了する動作が発生したことを思い出します。現在、私はLinux上でg ++を使用しています。これらの線に沿って解決策はありますか?
関連:[なくRELEASEでDEBUGで境界チェックを行うのstd ::ベクトルのオペレータのコンパイルを行う方法](http://stackoverflow.com/q/1290396/96780) –
私はまだこのことを知っていますコードの変更が必要ですが、コンテナの反復処理や範囲ベースの処理は、なぜプログラムが停止したかを調べることなく、これらの問題の大部分を解消します。私はメッセージがメモリを上書きするような未定義の動作よりも優れていると認めます。 – stefaanv
関連:[インデックスがベクトルクラスの範囲外にある場合、コンパイルエラーまたは実行時エラーはありません](http://stackoverflow.com/q/27754726/96780) –