作为存储多个状态日志等的简单方法,我选择了std::stringstream
。如果出现错误,我可以简单地将.rdbuf()
转储到一个文件中,以便能够重现我的程序在崩溃之前所做的事情。
我现在的问题是,这个字符串流的大小无限增长。我已经尝试了几件事来确保我只保留了流的最后一个1MiB但是没有成功。
.rdbuf()->pubseekoff(...)
.ignore(...)
getline(...)
ss.str() = ss.str().substr(...)
显然,底层缓冲区对象的大小总是增加 - 无论是否已经读取了某些数据。
有没有办法减小尺寸/保持一定的常数(最好没有常规的深拷贝)? 作为底层缓冲区对象的循环缓冲区将是完美的 - 这可能吗? ESP。那已经存在了吗?
编辑:解决方案基本上必须像流一样。它由procompiler放置而不是std :: err或直接文件流(类似于boost :: log)。因此,使用字符串流并非绝对必要,但非常有用。 (否则我必须实现所有的ostream东西才能流std :: endl ...)
答案 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成员。”
我将该句子解释为如果我指定一个空字符串,它将复制构造底层缓冲区。