-1

我有一个代码,我在 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 对象。

如何纠正这种行为?

4

2 回答 2

1

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

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

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

于 2015-09-22T09:57:16.783 回答
0

正如其他人在评论中已经说过的那样,不推荐使用 ostrstream 。

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

只需在堆栈上声明对象。

ostrstream strm;

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

于 2015-09-22T09:34:27.527 回答