如何用ostrstream避免缓冲区溢出
how to avoid buffer overflow with ostrstream
我有一个代码,我编译&在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,即使它不是类型安全的——它只是更紧凑。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 使用向量的缓冲区溢出
- 重新增长阵列时出错:写入时缓冲区溢出
- Leetcode 1366:堆缓冲区溢出
- 缓冲区溢出 - 数组索引越界(严重)
- C++二维矢量导致缓冲区溢出
- 缓冲区溢出怎么会成为黑客的攻击
- 如何防止缓冲区溢出
- 应该如何读取堆缓冲区溢出错误消息?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 读取文件时字符缓冲区溢出
- C 文本写入随机数据.是否有缓冲区溢出