Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: -0.975 c
1-1133366543
legeyda
2005-11-30 19:02
2005.12.25
Ошибка dib.dcu в делфи


4-1130414953
Rentgen
2005-10-27 16:09
2005.12.25
Как можно сменить программно пароль учетной записи (текущей)


3-1131443597
Laymer
2005-11-08 12:53
2005.12.25
Получение список таблиц и их полей


14-1133268593
Mike Kouzmine
2005-11-29 15:49
2005.12.25
Бедные немцы!


14-1133273376
sedot
2005-11-29 17:09
2005.12.25
Как снять защиту SSL-протокола?




   Наверх