У меня есть код, где я компилирую & загрузить его в машину 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;
}
Проблема здесь в том, что запрос памяти удваивается для каждого цикла в то время как.
[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.
Как исправить это поведение?
Согласно документации, ваш ostrstream будет продолжать выделять память для каждого вызова. Эта память никогда не освобождается. Чтобы избежать этого, объявите ostream как локальный объект (в стеке) и вызовите freeze (false), как только вы закончите (после каждого str ()), таким образом, память освобождается, когда вызывается деструктор ostream.
от: http://en.cppreference.com/w/cpp/io/ostrstream/freeze
После вызова str () динамические потоки автоматически замораживаются. Вызов freeze (false) требуется перед выходом из области, в которой был создан этот объект ostrstream. в противном случае деструктор потеряет память. Кроме того, дополнительный вывод в замороженный поток может быть обрезан, как только он достигнет конца выделенного буфера.
Как уже сказал кто-то в комментариях, ostrstream объявлен устаревшим.
Кроме того, это c ++, а не java, вы не должны использовать new для выделения ресурса.
Просто объявите объект в стеке.
ostrstream strm;
И вы могли бы забыть о потоке c ++, его синтаксис и внешний вид довольно неуклюже. Лично я предпочитаю старый добрый printf, даже когда он не является типобезопасным — он просто намного компактнее.