3

複数のステータス ログなどを保存する簡単な方法として、std::stringstream. エラーが発生した場合は、ファイルにダンプするだけで.rdbuf()、プログラムがクラッシュする前に実行していたことを再現できます。

私の問題は、この文字列ストリームのサイズが無限に大きくなることです。ストリームの最後の 1MiB 程度のみを保持するようにいくつかのことを試みましたが、成功しませんでした。

  1. .rdbuf()->pubseekoff(...)
  2. .ignore(...)
  3. getline(...)
  4. ss.str() = ss.str().substr(...)

どうやら、データの一部が既に読み取られているかどうかに関係なく、基礎となるバッファーオブジェクトは常にサイズが増加するだけです。

サイズを縮小する/一定に保つ方法はありますか (できれば通常のディープコピーなし)? 基礎となるバッファオブジェクトとしての循環バッファは完璧でしょう - それは可能ですか? 特に。それはすでに存在しますか?


編集:ソリューションは基本的にストリームのように動作する必要があります。これは、std::err または直接のファイル ストリーム (boost::log と同様) の代わりに、プロコンパイラによって配置されます。したがって、厳密に必要というわけではありませんが、stringstream を使用すると非常に便利です。(そうしないと、std::endl をストリーミングできるようにすべての ostream を実装する必要があります...)

4

1 に答える 1

1

現在の STL 実装 (VS2010 SP1) では、str("") はすべてのメモリを解放します

std::stringstream ss;
for(unsigned int i = 0; i<10000000; ++i)
{
    ss << "QWERTYUIOPASDFGHJKLXCVBNM";
}

ss.str(""); // memory released here

参照:「内部的に、関数はその内部文字列バッファー オブジェクトの str メンバーを呼び出します。」

この文を解釈すると、空の文字列を割り当てると、基になるバッファーがそれにコピー構築されます。

于 2013-09-12T00:52:40.977 に答える