4

std::tr1::array は、範囲外のインデックスにアクセスすると例外がスローされるという点で、boost::array と同じであるという印象を受けました。実際、ヘッダーをのぞいてみたところ、そのように見えます。次のコードがバス エラー (gcc バージョン 4.0.1 (Apple Inc. ビルド 5465)) と gcc 4.1.2 での segfault になる理由を誰か説明できますか?

ありがとう。

#include <exception>
#include <iostream>
#include <string>
#include <tr1/array>
#include <boost/array.hpp>

int main()
{
    // boost::array<std::string, 3> arr;
    std::tr1::array<std::string, 3> arr;
    try
    {
        arr.at( 0 ) = "one";
        arr.at( 1 ) = "two";
        arr.at( 2 ) = "three";
        arr.at( 3 ) = "nogood";
    }
    catch ( const std::exception& e )
    {
        std::cout << "exception: " << e.what() << std::endl;
    }
    return 0;
}
4

2 に答える 2

4

インストールされているコンパイラの特定のバージョンのバグである可能性があります。私のシステム(Linux x86-64)のコードに対してGCCが行うことは次のとおりです。

$ g++-4.1.2 test.cpp -o test
$ ./test
exception: array::_M_at
$ g++-4.3.5 test.cpp -o test
$ ./test
exception: array::at
$ g++-4.4.4 test.cpp -o test
$ ./test
exception: array::at
$ g++-4.5.0 test.cpp -o test
$ ./test
exception: array::at

したがって、これは全面的に機能するようであり、特に、GCC 4.1.2 を搭載した私のマシンでは正常に動作しているように見えますが、あなたのマシンでは失敗します。クラッシュの時点でスタック バックトレースを取得しようとしましたか? Valgrind も役立つ場合があります。

于 2010-06-23T13:14:53.163 に答える
0

3つの要素の配列()を割り当ててarray<std::string, 3>いますが、4番目の要素()にアクセスしようとしていますarr.at(3)。boost :: arrayは、アサーションを使用して境界チェックを実行します。tr1 :: arrayについてはよくわかりませんが、(ドラフト)C ++ 0x標準を読んだ場合、array::operator[]()範囲外のインデックスをスローする必要はありません。したがって、tr1::arrayの実装はboost::arrayと同様に動作していると思います(デバッグビルドではアサーションを発生させ、リリースビルドでは何もしません)。これは、テストコードの「バスエラー」/「segfault」を説明します。

于 2010-06-23T13:40:55.400 に答える