は、Googleのテストはここに関与していない(私はほとんど...その古き良きIndexOutOfBoundsExceptionとJava用の長い開始します)。あなたのC++標準ライブラリ実装は例外をスローしています。例外をどのようにして冗長にするかは、C++標準ライブラリの実装によって決まります。
例外が発生しているので、std::vector::operator[]
の代わりにstd::vector::at
を使用していることを前提としています。より多くの情報を得るために取ることができるアプローチには、いくつか考えられます。
まず、あなたは(個人的に、私は非常に有用であることを確認しat
の例外が発生範囲を見つけることができませんし、それがパフォーマンスのオーバーヘッドを持っている)とあなたのC++標準を使用operator[]
への呼び出しでat
への呼び出しを置き換えることができますライブラリ実装のイテレータデバッグ私はoperator[]
を使用している場合たとえば、グラム++で、operator[]
をチェックする範囲をオンにする-D_GLIBCXX_DEBUG
でコンパイルし、私は次のようなエラーが出る:
/usr/include/c++/4.3/debug/vector:237:error: attempt to subscript container
with out-of-bounds index 0, but container only holds 0 elements.
第二に、あなたはtest_at
への呼び出しでat
への呼び出しを置き換えることができますまたは類似:(未テスト)
template <typename T>
T& test_at(std::vector<T>& v, size_t n) {
// Use Google Test to display details on out of bounds.
// We can stream additional information here if we like.
EXPECT_LT(n, v.size()) << "for vector at address " << &v;
// Fall back to at, and let it throw its exception, so that our
// test will terminate as expected.
return v.at(n);
}
@gtest_catch_exceptions = 0 – JaredC
@JaredCこのフラグは、例外がスローされた後にテストを終了しますが、出力は例外(ベクトル、インデックス、範囲)の起点に関する情報をもう与えません。 – clstaudt
@cls:デバッガでテストしたり、終了後にコアダンプを調べたりすると、未処理の例外がスローされた場所がわかります。代わりに、 'std :: __ throw_out_of_range'にブレークポイントを置くこともできます。これはGNUライブラリが例外をスローするために呼び出す関数です。 –