Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2012, 11:38   #1
dimavit
Пользователь
 
Регистрация: 04.07.2010
Сообщений: 28
По умолчанию Out of system resources

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

Код:
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. Объекты представляют собой созданный класс
dimavit вне форума Ответить с цитированием
Старый 17.08.2012, 11:41   #2
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Нужен код полностью.
Kix.IV вне форума Ответить с цитированием
Старый 17.08.2012, 11:59   #3
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

dimavit, а если я передам Index больше, чем размер массива, почему массив все-таки уменьшается? Этого не должно быть.
volvo877 вне форума Ответить с цитированием
Старый 17.08.2012, 12:05   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

По поводу удаления: setLength( A, Last ) лишь устанавливает размер массива, в итоге удаляется только указатель на объект, а не сам объект. Перед сдвигом надо вызвать деструктор для удаляемого A.
eoln вне форума Ответить с цитированием
Старый 17.08.2012, 12:09   #5
dimavit
Пользователь
 
Регистрация: 04.07.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Нужен код полностью.
Сейчас под рукой нет. Но вопрос состоит в том, нужно ли удалять объект дополнительно для освобождения памяти, или достаточно того, что он будет удален из массива?
dimavit вне форума Ответить с цитированием
Старый 17.08.2012, 12:10   #6
dimavit
Пользователь
 
Регистрация: 04.07.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
По поводу удаления: setLength( A, Last ) лишь устанавливает размер массива, в итоге удаляется только указатель на объект, а не сам объект. Перед сдвигом надо вызвать деструктор для удаляемого A.
Спасибо, Вы успели ответить на вопрос раньше, чем я его сформулировал.
dimavit вне форума Ответить с цитированием
Старый 17.08.2012, 12:15   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Небольшая поправка. Деструктор для A[Index], который находится в A
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Ambiguity between '_fastcall System::operator +(int,const System::Variant &)' and '_fastcall System::opera Jawner C++ Builder 1 12.04.2012 09:58
Out of system resources sergeyrulit Общие вопросы Delphi 1 19.11.2010 23:53
Resources в VS 2008 C# WOWka777 Общие вопросы .NET 0 24.04.2010 16:47
Office System Developer Resources niziriska Общие вопросы .NET 0 16.04.2010 10:26
Resources HunterMan Общие вопросы .NET 3 31.12.2009 19:04