如何避免使用ostrstream缓冲区溢出

时间:2015-09-22 09:20:57

标签: c++ overflow vxworks sstream

我有一个代码,我编译&将它加载到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对象。

如何纠正这种行为?

2 个答案:

答案 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 ++流媒体的东西,它的语法和外观相当笨重。就个人而言,我更喜欢优质的老版画,即使它不是类型安全的 - 它只是更紧凑。