3

作为存储多个状态日志等的一种简单方法。我选择了一个std::stringstream. 如果出现错误,我可以简单地转储.rdbuf()到一个文件中,以便能够重现我的程序在崩溃之前所做的事情。

我现在的问题是,这个字符串流的大小会无限增长。我已经尝试了几件事来确保我只保留流的最后 1MiB 左右,但没有成功。

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

显然,底层缓冲区对象总是只会增加大小 - 无论是否已经读取了一些数据。

有什么方法可以减小大小/将其保持在某个常数(最好没有常规的深拷贝)?作为底层缓冲区对象的循环缓冲区将是完美的 - 这可能吗?特别是。那已经存在了吗?


编辑:该解决方案基本上必须表现得像一个流。它由 procompiler 放置,而不是 std::err 或直接文件流(类似于 boost::log)。因此,使用字符串流不是绝对必要的,但非常有用。(否则我必须实现所有 ostream 的东西才能流式传输 std::endl ...)

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 回答