2016-03-23 6 views
1

は、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 ++を使用しています。これらの線に沿って解決策はありますか?

+2

関連:[なくRELEASEでDEBUGで境界チェックを行うのstd ::ベクトルのオペレータのコンパイルを行う方法](http://stackoverflow.com/q/1290396/96780) –

+1

私はまだこのことを知っていますコードの変更が必要ですが、コンテナの反復処理や範囲ベースの処理は、なぜプログラムが停止したかを調べることなく、これらの問題の大部分を解消します。私はメッセージがメモリを上書きするような未定義の動作よりも優れていると認めます。 – stefaanv

+2

関連:[インデックスがベクトルクラスの範囲外にある場合、コンパイルエラーまたは実行時エラーはありません](http://stackoverflow.com/q/27754726/96780) –

答えて

1

enable debug mode in STL containers-D_GLIBCXX_DEBUGでコンパイルします。

また、__gnu_debug namespaceにある特定のデバッグコンテナを使用することもできます。 __gnu_debug::vector

#include <iostream> 
#include <debug/vector> 

int main() 
{ 
    __gnu_debug::vector <int> x(1); 
    for(int q = 0; ; q++) 
    { 
     int y = x[q]; 
     std::cout << q << " "; 
    } 
} 
+1

デバッグ・コンテナの利点は、特定のコンテナを分離し、後でstd :: containersで簡単に切り替えることができるということですね。とにかくこの出力を変更したり、何とか解釈したりできますか? '操作に関係するオブジェクト:sequence" this "@ 0x0x7ffc2b96e950 {type = NSt7__debug6vectorIiSaIiEEE;}' –

+0

libstdC++ソースのarouundのハッキングを開始しない限り、標準的なデバッグエラーメッセージが残っていると思います。それでも、[_GLIBCXX_DEBUG_VERIFY](https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_design.html)を参照してください。 –

+0

-D_GLIBCXX_DEBUGが一般的にブーストと互換性があるかどうか知っていますか? –

2

インデックスがベクトル範囲に違反する場合、std::vector::atメンバ関数を使用してout_of_range例外をスローすることができます。

#include <vector> 
#include <iostream> 

int main() { 
    std::vector <int> x(1); 
    for(int q=0;; ++q) { 
    int y = x.at(q); 
    std::cout << q << " "; 
    } 
} 
+0

お役立ち情報これは私のプログラムですべての要素アクセス呼び出しを置き換える必要がありますが。可能であれば、私はまだコンパイラオプションを持っていたいと思います。 –

関連する問題