Один список на два потока - не освобождается память
От: SuperVK  
Дата: 14.10.05 11:40
Оценка:
Не освобождается память при удалении элементов из списка и памяти.

Два потока (нити) работают с одним списком std::list:
list<SPack *> lt_pack;

где структура SPack:
struct SPack
{
     byte               * buf;  
     unsigned short int   size; 
};


Один поток добавляет в этот список элементы:
SPack * packet;

packet = new SPack;
packet->buf = new byte[special_size];
packet->size = special_size;
lt_pack.push_back( packet );


второй, периодически выполняя над элементами списка определённые действия, удаляет их из списка таким образом:
SPack * pack;
list<SPack *>::iterator ipack;

ipack = lt_pack.begin();
pack  = * ipack;
lt_pack.erase(lt_pack.begin());
delete[] pack->buf;
delete pack;


при работе программы, память не освобождается. Т.е. при добавлении новых элементов списка память съедается, а при удалении, размер памяти, используемой программой не уменьшается. Но при последующем добавлении, количество используемой программой памяти не увеличивается, пока суммарный объём добавляемых элементов не перешагнёт предыдущие объёмы. Т.е. объём памяти используемый программой всегда равен пиковому объёму списка, как будто windows помечает память, как свободную, но у процесса её не забирает.

Это я надумал основываясь на показаниях Диспетчера задач windows.

Ещё одна загвоздка в том, что если я ради эксперимента структуру определяю так:
struct SPack
{
     byte                 buf[256];  
     unsigned short int   size; 
};

и убираю все new и delete, связанные с SPack::buf, то память освобождается и добавляется нормально, никаких проблем.
Почему такая разница?

Правильно ли я выделяю/освобождаю память?
Если дело в диспетчере задач/windows, то каким образом можно контролировать реальный объём памяти, используемый программой?

Подскажите, пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.