Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Опять вопрос про классы


Piero ©   (2005-12-07 13:23:00) 

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

Txy = record
         x,y : integer;
        end;

TElem = class
 protected
  L         : byte;
  direction : smallint;
  sum       : word;
  path      : TarrayXY;
  level     : integer;
  Num       : integer;
....

constructor TElem.Create;
begin
inherited Create;
L     :=30;
sum   :=0;
Level :=0;
Number:=0;
end;

destructor TBranch.Destroy;
begin
inherited Destroy;
path:=nil;
end;

то что я сказал я уничтожаю объекты типа TElem - я их использую в процедуре, при выходе из процедуры, все объекты уничтожаются ведь.


Piero   (2005-12-07 15:42:00) [1]

Понял, спасибо, значит я как раз освобождал память по указателю nil, а надо было по реальному


Piero   (2005-12-07 15:40:00) [2]

Делаю так:

for i:=1 to 2000000 do
  begin
   br:= TElem.create;
  end;

или так

for i:=1 to 2000000 do
  begin
   br:= TElem.create;
   br:=nil;
   br.Free;
  end;

разницы никакой, памяти жрет столько же (очень много), как же высвободить её от этих объектов


Игорь Шевченко   (2005-12-07 15:39:00) [3]

Piero ©   (07.12.05 15:35) [7]


> for i:=1 to 2000000 do
>   begin
>    br:= TElem.create;
>    br:=nil;
>    br.Free;
>   end;


for i:=1 to 2000000 do begin
 br := TElem.Create;
 br.Free;
end;


Piero   (2005-12-07 15:35:00) [4]

Делаю так:

for i:=1 to 2000000 do
  begin
   br:= TElem.create;
  end;

или так

for i:=1 to 2000000 do
  begin
   br:= TElem.create;
   br:=nil;
   br.Free;
  end;

разницы никакой, памяти жрет столько же (очень много), как же высвободить её от этих объектов


Piero   (2005-12-07 15:00:00) [5]

umbra ©, понял, но разницы по памяти - никакой

Alexander Panov ©, ясно


Alexander Panov   (2005-12-07 14:56:00) [6]

Piero ©   (07.12.05 13:23)
что я должен сделать в деструкторе, чтобы память освобождалась


Ничего.
Главное, чтобы объекты типа TElem уничтожались.
Память, выделенная под динамический массив path будет освобождена автоматически после уничтожения объекта.


umbra   (2005-12-07 14:34:00) [7]

В деструкторе inheritedлучше вызывать после того, как Вы уничтожаете свои данные.


destructor TBranch.Destroy;
begin
 path := nil;
 inherited;
end;


Piero   (2005-12-07 14:26:00) [8]

С free, тоже память не освобождается, может я неправильно деструктор описал?


Piero   (2005-12-07 14:18:00) [9]

А ну да, без free, деструктор не срабатывает.


Sapersky   (2005-12-07 14:12:00) [10]

при выходе из процедуры, все объекты уничтожаются ведь.

В смысле, рассчитываешь, что они сами по себеуничтожатся (как длинные строки и дин. массивы)?
Нет, не уничтожатся. Нужно вручную (Free).


Наверх

Титульная страница Поиск, карта сайта Написать письмо