Out of system resources

 
0
 
Delphi, Kylix and Pascal
ava
dimavit | 17.08.2012, 11: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. Объекты представляют собой созданный класс
Ответы (5)
ava
Illusion Dolphin | 17.08.2012, 10:38 #
Цитата


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


Может. А где освобождение памяти под объект? Вы уменьшаете размер массива на 1, но при этом объект остаётся в памяти.
ava
dimavit | 17.08.2012, 11:04 #
Цитата (Illusion Dolphin @ 17.8.2012, 10:38)
Цитата



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




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

Я предполагал, что объект должен освобождать память будучи удаленным из массива. Но подозрение было, что возможно и нет. Значит оно подтверждается?
ava
Frees | 17.08.2012, 11:11 #
используй TList а не массив, там обовсем подумали уже.

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

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

ReportMemoryLeaksOnShutdown := True
ava
dimavit | 17.08.2012, 11:24 #
Цитата (Frees @ 17.8.2012, 11:11)
используй TList а не массив, там обовсем подумали уже.



Добавлено позднее:

Или если версия делфи свежая то можно generics использовать



Добавлено позднее:

Проверить наличие утечки памяти можно с помощью


  ReportMemoryLeaksOnShutdown := True


Спасибо!
ava
bems | 17.08.2012, 12:14 #
Цитата (Frees @ 17.8.2012, 11:11 findReferencedText)
используй TList а не массив, там обовсем подумали уже
там есть решение проблемы постоянного перевыделения памяти, а удаления объекта при удалении элемента там нет

список владеющий объектами это TObjectList или TObjectList<T>
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить