Как избежать переполнения буфера с 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;
}

Проблема здесь в том, что запрос памяти удваивается для каждого цикла в то время как.

[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.

Как исправить это поведение?

-1

Решение

Согласно документации, ваш ostrstream будет продолжать выделять память для каждого вызова. Эта память никогда не освобождается. Чтобы избежать этого, объявите ostream как локальный объект (в стеке) и вызовите freeze (false), как только вы закончите (после каждого str ()), таким образом, память освобождается, когда вызывается деструктор ostream.

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

После вызова str () динамические потоки автоматически замораживаются. Вызов freeze (false) требуется перед выходом из области, в которой был создан этот объект ostrstream. в противном случае деструктор потеряет память. Кроме того, дополнительный вывод в замороженный поток может быть обрезан, как только он достигнет конца выделенного буфера.

1

Другие решения

Как уже сказал кто-то в комментариях, ostrstream объявлен устаревшим.

Кроме того, это c ++, а не java, вы не должны использовать new для выделения ресурса.

Просто объявите объект в стеке.

ostrstream strm;

И вы могли бы забыть о потоке c ++, его синтаксис и внешний вид довольно неуклюже. Лично я предпочитаю старый добрый printf, даже когда он не является типобезопасным — он просто намного компактнее.

0

По вопросам рекламы [email protected]