【发布时间】:2015-09-22 09:20:57
【问题描述】:
我有一个代码,我在 vxworks 机器中编译和加载它,我看到缓冲区溢出。
#include<strstream>
#include<iostream>
#include<sstream>
using namespace std;
ostrstream *strm = 0;
int newcout()
{
if(strm == 0)
{
strm = new ostrstream();
}
while(1)
{
(*strm)<<".VXworks_print"<<endl;
}
return 0;
}
这里的问题是,while 中的每个循环,内存请求都会不断翻倍。
[maxBlock = 8497968/ allocSize = 12700]
[maxBlock = 8485176/ allocSize = 25500]
[maxBlock = 8459584/ allocSize = 51100]
[maxBlock = 8408392/ allocSize = 102300]
[maxBlock = 8306000/ allocSize = 204700]
[maxBlock = 8101208/ allocSize = 409500]
[maxBlock = 7691616/ allocSize = 819100]
[maxBlock = 7086744/ allocSize = 1638300]
[maxBlock = 7086744/ allocSize = 3276700]
[maxBlock = 7086744/ allocSize = 6553500]
[maxBlock = 8497288/ allocSize = 13107100]
当分配请求超过最大可用块时,会导致陷阱。
我认为我们看到这种行为是因为重用了 ostrstream 对象。
如何纠正这种行为?
【问题讨论】:
-
ostrstream 已被弃用,不应编写使用它的新代码(您应该改用std::ostringstream)
-
此外,endl 运算符不仅仅是“行尾”——它还进行了 flush() 调用。我强烈建议您将其替换为 '\n' 并在循环外调用 flush()。
标签: c++ overflow vxworks sstream