如何用ostrstream避免缓冲区溢出

how to avoid buffer overflow with ostrstream

本文关键字:缓冲区 溢出 何用 ostrstream      更新时间:2023-10-16

我有一个代码,我编译&在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]

当分配请求超过最大可用块时,会导致trap。

我认为我们看到这种行为是因为重用了ostrstream对象。

如何纠正这种行为?

根据文档,您的ostrstream将继续为每个调用分配内存。这个内存永远不会被释放。为了避免这种情况,请将ostream声明为本地对象(在堆栈中),并在完成后(在每个str()之后)调用freeze(false),这样在调用ostream的析构函数时释放内存。

从:http://en.cppreference.com/w/cpp/io/ostrstream/freeze

调用str()后,动态流将自动冻结。在退出创建此ostrstream对象的作用域之前,需要调用freeze(false)。否则析构函数将泄漏内存。此外,冻结流的额外输出可能会在到达分配缓冲区的末尾时被截断。

就像其他人在评论中说的那样,ostrstream已经被弃用了。

此外,这是c++而不是java,你不应该使用new来分配资源。

直接在栈上声明对象

ostrstream strm;

你可以考虑忘记c++流的东西,它的语法和外观相当笨拙。就我个人而言,我更喜欢老式的printf,即使它不是类型安全的——它只是更紧凑。