减少字符串流的大小

时间:2013-09-11 23:37:30

标签: c++ c++11 std stringstream

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

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

  1. .rdbuf()->pubseekoff(...)
  2. .ignore(...)
  3. getline(...)
  4. ss.str() = ss.str().substr(...)
  5. 显然,底层缓冲区对象的大小总是增加 - 无论是否已经读取了某些数据。

    有没有办法减小尺寸/保持一定的常数(最好没有常规的深拷贝)? 作为底层缓冲区对象的循环缓冲区将是完美的 - 这可能吗? ESP。那已经存在了吗?


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

1 个答案:

答案 0 :(得分:0)

在我当前的STL实现(VS2010 SP1)上,str(“”)释放所有内存

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

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

Reference:“在内部,函数调用其内部字符串缓冲区对象的str成员。”

我将该句子解释为如果我指定一个空字符串,它将复制构造底层缓冲区。