Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Опять вопрос про классы   Найти похожие ветки 

 
Piero ©   (2005-12-07 13:23) [0]

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

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 - я их использую в процедуре, при выходе из процедуры, все объекты уничтожаются ведь.


 
Sapersky   (2005-12-07 14:12) [1]

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

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


 
Piero ©   (2005-12-07 14:18) [2]

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


 
Piero ©   (2005-12-07 14:26) [3]

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


 
umbra ©   (2005-12-07 14:34) [4]

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


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


 
Alexander Panov ©   (2005-12-07 14:56) [5]

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


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


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

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

Alexander Panov ©, ясно


 
Piero ©   (2005-12-07 15:35) [7]

Делаю так:

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) [8]

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:40) [9]

Делаю так:

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:42) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
2-1134053886
coral
2005-12-08 17:58
2005.12.25
StringGrid


14-1133338697
блин
2005-11-30 11:18
2005.12.25
Авторские права


2-1134234102
Alexious
2005-12-10 20:01
2005.12.25
Много одинаковых объектов


2-1134139169
Zilog
2005-12-09 17:39
2005.12.25
ShellExecute


2-1133854420
Piero
2005-12-06 10:33
2005.12.25
Как сделать таймер в потоке