我有一个代码,我编译&将它加载到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]
当alllocation请求超出max available block时,会导致陷阱。
我认为我们看到这种行为是因为重新使用了ostrstream对象。
如何纠正这种行为?
答案 0 :(得分:1)
根据文档,您的ostrstream将为每次调用分配内存。永远不会释放这个记忆。为了避免这种情况,将ostream声明为本地对象(在堆栈中)并在完成后调用冻结(false)(在每个str()之后),这样在调用ostream的析构函数时释放内存。
来自:http://en.cppreference.com/w/cpp/io/ostrstream/freeze
调用str()后,动态流会自动冻结。在退出创建此ostrstream对象的作用域之前,需要调用freeze(false)。否则析构函数会泄漏内存。此外,冻结流的附加输出一旦到达分配的缓冲区的末尾就可能被截断。
答案 1 :(得分:0)
正如其他人在评论中已经说过的那样,ostrstream已经过时了。
此外,这是c ++而不是java,你不应该使用new来分配资源。
只需在堆栈上声明对象。
ostrstream strm;
你可以考虑忘记c ++流媒体的东西,它的语法和外观相当笨重。就个人而言,我更喜欢优质的老版画,即使它不是类型安全的 - 它只是更紧凑。