4

[ここで重複が見つかりました: C++ - 範囲外アクセスの検出]

次のように、「範囲外のベクトルアクセス」を使用するプログラムがある場合:

  std::vector<int> A(2);
  ...
  A[10] = 3;

このエラーを確実に見つける方法はありますか? デバッグモードでコンパイルして、何らかのアサーションが実行を停止するかどうかを確認するようなことを意味します。

今まで自分で調べてきました。しかし、追加のコードを書く必要はないのでしょうか?


PSもちろんアサーションをチェックしました。呼び出されません。

このプログラムでは:

#include <vector>

int main() {
  std::vector<int> A(2);
  A[10] = 3;
  return 0;
}

によって編集された

g++ 1.cpp -O0; ./a.out

そのため、std にはコードにアサーションがないように見えますが、なぜこのような単純なチェックを行わないのか不思議に思うことはありません。

4

2 に答える 2

13

at()メンバー関数を使用:

std::vector<int> A(2);

A.at(10) = 3;  //will throw std::out_of_range exception!

例外をスローする可能性があるため、キャッチしたいと考えています。だからtry{} catch{}ブロックを使おう!

それが役立つことを願っています。

于 2013-11-06T19:50:55.853 に答える
1

このエラーを確実に見つける方法はありますか? デバッグモードでコンパイルして、何らかのアサーションが実行を停止するかどうかを確認するようなことを意味します。

Valgrind はこれらのエラーを簡単にキャッチします。とにかく走れ:

valgrind ./YOUR_EXECUTABLE

なぜこんな簡単なチェックをしないのか不思議でなりません。

この回答を参照してください。

于 2014-12-08T15:39:50.433 に答える