![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять вопрос про классы
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).