kulakovboris
Зарегистрирован: 05.12.2011 Сообщения: 1
|
Добавлено: Пн Дек 05 2011 08:22 Заголовок сообщения: Delphi -- утечка памяти на ровном месте |
|
|
Для удобства разработки сделал новый класс, являющийся наследником предыдующего. Только метод Create у него немного не такой, а немного переделанный. Это было сделано с целью повышения наглядности программного кода.
Но вот только стали происходить УТЕЧКИ ПАМЯТИ. Долго копался, в чём причина, потом упростил всё буквально до Create-Free, утечка всё равно присутствует.
Вот листинг (здесь всё сильно упрощено, оставлено минимально необходимое для понимания ситуации):
UNIT Unit1;
INTERFACE
USES
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
TThread2=class(TThread)
constructor Create(p: TThreadPriority);
end;
var
Form1: TForm1;
IMPLEMENTATION
{$R *.dfm}
constructor TThread2.Create(p: TThreadPriority);
begin
TThread(self):=TThread.Create(true);
self.Priority:=p;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
memory0, memory: integer;
p: pointer;
T: TThread; T2: TThread2;
i: integer;
begin
memory0:=GetHeapStatus.TotalAllocated;
for i:=1 to 1000 do begin
T:=TThread.Create(true);
T.Free;
end;
memory:=GetHeapStatus.TotalAllocated;
ShowMessage('Memory consumption: '+inttostr(memory-memory0));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
memory0, memory: integer;
p: pointer;
T: TThread; T2: TThread2;
i: integer;
begin
memory0:=GetHeapStatus.TotalAllocated;
for i:=1 to 1000 do begin
T2:=TThread2.Create(tpLower);
T2.Free;
end;
memory:=GetHeapStatus.TotalAllocated;
ShowMessage('Memory consumption: '+inttostr(memory-memory0));
end;
END.
При Button1.Click потребление памяти составляет 0 байт, при Button2.Click -- 64000 байт. А собственно, почему? Вроде всё корректно должно освобождаться... |
|
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Вт Дек 06 2011 20:40 Заголовок сообщения: |
|
|
Угу... Мудро... Создать в классе другой объект и наивно надеяться, что при Free от класса, удаляться и все то, что ты там сам насоздавал....
В UNIX такое называется "зомби-процесс". Т.е. когда нет хозяина, а дети им порожденные бродят по ОС и память занимают.
В общем если в Create что-то создаешь, то будь добр во Free объекты тобой созданные так же по-килять.
Надеюсь понятно изложил? |
|