2

次のコードは、 を で使用するunderflowときに が呼び出される頻度を単純にテストします。std::istream readstd::stringbuf

#include <iostream>
#include <vector>
#include <sstream>

class TestStringBuf : 
public std::stringbuf
{
public:

    int_type underflow()
    {
        std::cout<<"TestStringBuf underflow"<<std::endl;
        return std::stringbuf::underflow();
    }
};

int main(int argc, const char * argv[])
{
    TestStringBuf buf;
    std::iostream stream(&buf);

    stream << "tesr";

    std::vector<char> data(4);
    stream.read(&data[0], 4);

    for(int i=0; i<data.size(); ++i)
        std::cout<<data[i];
    std::cout<<std::endl;

    return 0;
}

出力は次のとおりです。

TestStringBuf underflow
TestStringBuf underflow
test

get 領域に存在するバイト数を正確に読み取ったため、アンダーフローは 1 回だけ呼び出されると予想していましたが、なぜ再びアンダーフローする必要があるのでしょうか。これは予想される動作ですか?私のカスタムunderflowメソッドは、新しいデータを読み取るために長時間ブロックされる可能性があるため、質問してunderflowいます。この場合、2 番目の呼び出しはあまり望ましくありません。

私はclang 3.1libc++を使用して Osx を使用しています。

ありがとうございました!

アップデート:

私は完全に別のテストを作成しましたが、これはlibstd++ では発生しないため、これはlibc++実装の奇妙さのように思えます。誰かが他の実装でこれをテストできますか? これはバグですか、それとも単なる実装の違いですか (私にはかなりバグがあるように感じます)。上記のコードを更新して、任意の main.cpp にコピー アンド ペーストできるようにしました。

アップデート2:

結局、これは libc++ のバグでした。 http://llvm.org/bugs/show_bug.cgi?id=13113を参照してください。自分で libc++ をコンパイルすれば、バグはなくなるはずです。すぐに試してみます。

4

1 に答える 1

0

C++ 標準では、std::basic_streambuf の内部バッファーを使用する代わりに、std::basic_stringbuf の実装が文字シーケンスを std::basic_string に格納することを明示的に許可しています。

于 2012-06-14T17:10:02.580 に答える