Размер boost :: asio :: streambuf будет увеличиваться до тех пор, пока не будет вызван потребление ().
Даже после того, как потребление () вызывается, память, используемая базовым буфером, никогда не будет освобождена.
Например: следующий код сначала создал streambuf без указания max_size.
Затем он сбрасывает 14Mb данных в streambuf.
Затем он потребляет все эти 14 МБ данных.
В точке 2000 streambuf.size () равен 0, но «top» показывает, что процесс все еще занимает 14 МБ оперативной памяти.
Я не хочу указывать max_size.
Есть ли в любом случае, чтобы уменьшить streambuf после того, как он пуст?
#include <boost/asio.hpp>
#include <iostream>
#include <string>
int main()
{
{
boost::asio::streambuf b;
std::ostream os(&b);
for(int i= 0; i<1000000; ++i)
{
os << "Hello, World!\n";
}
std::cout<<"point 1000"<<std::endl;
std::cout<<"size="<<b.size()<<std::endl;
// at this point, the streambuf's size is close to 14MB.b.consume(b.size());
std::cout<<"point 2000"<<std::endl;
std::cout<<"size="<<b.size()<<std::endl;
// at this point, the streambuf.size() is 0
// but the streambuf's underlying buffer, which is a vector I assume,
// still hold that 14MB space.
// "top" shows the process size is 14M}
// at this point, "top" showed the process size shrinks to almost zero
std::cout<<"point 4000"<<std::endl;
return 0;
}
Итак, я посмотрел в источниках и мне показалось два замечания.
Вы правы, буфер реализован как std :: vector, но это
Пользователь является приватным и не имеет доступа к нему.
Метод потребления не касается этого поля.
В вашем случае вы должны уничтожить буферный объект после потребления. Это самый простой способ решения проблемы. В целях оптимизации вы можете запомнить последний размер буфера и создать новый буфер с заданной емкостью, передав последний размер конструктору. Вы можете написать обертку вокруг этой функциональности, чтобы получить читаемый код.
Других решений пока нет …