Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Out of system resources


Автор: dimavit 17.8.2012, 10:35
В цикле постоянно создаются и удаляются объекты, входящие в динамический массив. Удаление производится при помощи такой процедуры:
 
Код

procedure delElem( var A:TRectArray; Index:integer );   
var Last : integer;   
begin  
   Last:= high( A );   
   if Index <  Last then move( A[Index+1], A[ Index ],   
       (Last-Index) * sizeof( A[Index] )  );   
   setLength( A, Last );   
end; 


Не может ли возникнуть ситуация, при которой в данном случае объект не полностью освобождает память? Дело в том, что при определенном количестве шагов цикла возникает ошибка "Out of system resources". При этом в массиве имеется всего от 5 до 20 объектов. А в ходе всей работы их было создано и удалено тысяч 15. Объекты представляют собой созданный класс

Автор: Illusion Dolphin 17.8.2012, 10:38
Цитата

Не может ли возникнуть ситуация, при которой в данном случае объект не полностью освобождает память?

Может. А где освобождение памяти под объект? Вы уменьшаете размер массива на 1, но при этом объект остаётся в памяти.

Автор: dimavit 17.8.2012, 11:04
Цитата(Illusion Dolphin @ 17.8.2012,  10:38)
Цитата

Не может ли возникнуть ситуация, при которой в данном случае объект не полностью освобождает память?

Может. А где освобождение памяти под объект? 

 Я предполагал, что объект должен освобождать память будучи удаленным из массива. Но подозрение было, что возможно и нет. Значит оно подтверждается?

Автор: Frees 17.8.2012, 11:11
используй TList а не массив, там обовсем подумали уже.

Добавлено через 4 минуты и 5 секунд
Или если версия делфи свежая то можно generics использовать

Добавлено через 7 минут и 47 секунд
Проверить наличие утечки памяти можно с  помощью
Код

  ReportMemoryLeaksOnShutdown := True

Автор: dimavit 17.8.2012, 11:24
Цитата(Frees @ 17.8.2012,  11:11)
используй TList а не массив, там обовсем подумали уже.

Добавлено @ 11:15
Или если версия делфи свежая то можно generics использовать

Добавлено @ 11:19
Проверить наличие утечки памяти можно с  помощью
Код

  ReportMemoryLeaksOnShutdown := True

Спасибо!

Автор: bems 17.8.2012, 12:14
Цитата(Frees @  17.8.2012,  11:11 Найти цитируемый пост)
используй TList а не массив, там обовсем подумали уже
там есть решение проблемы постоянного перевыделения памяти, а удаления объекта при удалении элемента там нет

список владеющий объектами это TObjectList или TObjectList<T>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)