![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти на ровном месте [D7, WinXP]
kulakovboris © (2011-12-05 09:20:00)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.
я (2011-12-06 17:49:00) [1]
> Из невежества произрастает твоя "любовь".
> Или неспособность к любви.
запусти хоть раз делфи для разнообразия, может перестанешь говорить тогда о том, о чем понятия не имеешь.
Сергей М. (2011-12-06 13:31:00) [2]Из невежества произрастает твоя "любовь".
Или неспособность к любви.
я (2011-12-06 13:03:00) [3]
> Похоже у тебя большие проблемы со зрением.
> Не пора ли показаться окулисту ?
Узкий кругозор и хамство произрастают из невежества.
Сергей М. (2011-12-06 09:22:00) [4]
> за ее неспособность сказать в каком конкретно месте возникает
> ошибка о которой она говорит
Похоже у тебя большие проблемы со зрением.
Не пора ли показаться окулисту ?
я (2011-12-06 03:04:00) [5]А как определить что происходит утечка памяти? А то когда у меня программа зацикливается, то в конце концов вылетает из за нехватки памяти. Но нет ни одной идеи где искать. Да и оно ли это.
я (2011-12-06 02:57:00) [6]за что "люблю" делфи, так это за ее неспособность сказать в каком конкретно месте возникает ошибка о которой она говорит.
Плохиш (2011-12-05 10:49:00) [7]Не, это одна из обезьян, пытающихся настучать войну и мир.
Сергей М. (2011-12-05 09:56:00) [8]
> до 2 часов ночи пробовал и inherited(create) и Create(true)
> с override и overload
Ну как тут не вспомнить Крылова И.А..
kulakovboris (2011-12-05 09:49:00) [9]Спасибо за совет! Теперь память не жрёт!
А то вчера до 2 часов ночи пробовал и inherited(create) и Create(true) с override и overload, а до такой простой вещи не допёр :)
MBo (2011-12-05 09:45:00) [10]constructor TThread2.Create(p: TThreadPriority);
begin
inherited Create(true);
Priority:=p;
end;
RWolf (2011-12-05 09:44:00) [11]
> [5]
опередил )
RWolf (2011-12-05 09:43:00) [12]почему бы просто не inherited Create(True); как положено?
Slym (2011-12-05 09:43:00) [13]kulakovboris © (05.12.11 9:20)
constructor TThread2.Create(p: TThreadPriority);
begin
TThread(self):=TThread.Create(true);
self.Priority:=p;
end;
type
TThread2=class(TThread)
public
constructor Create(p: TThreadPriority);
end;
constructor TThread2.Create(p: TThreadPriority);
begin
inheritedCreate(true);
Priority:=p;
end;
kulakovboris (2011-12-05 09:38:00) [14]self:= TThread2(TThread.Create(true));
если сделать так, память всё равно жрёт -- те же 64 байта, ничего не меняется.
kulakovboris (2011-12-05 09:37:00) [15]Созадние и освобождение здесь:
T2:=TThread2.Create(tpLower);
T2.Free;
Что-то там освобождается, но почему-то 64 байта всё равно теряются.
А как сделать не по-идиотски, но чтобы интерфейс класса остался таким же?
TThread2=class(TThread)
constructor Create(p: TThreadPriority);
end;
sniknik (2011-12-05 09:30:00) [16]обьясни вот этот идеотизм в конструкторе...
TThread(self):= TThread.Create(true);
или это "так надо и не спрашивайте почему", где тогда освобождение?
kulakovboris (2011-12-05 09:21:00) [17]Для удобства разработки сделал новый класс, являющийся наследником предыдующего. Только метод Create у него немного не такой, а немного переделанный. Это было сделано с целью повышения наглядности программного кода.
Но вот только стали происходить УТЕЧКИ ПАМЯТИ. Долго копался, в чём причина, потом упростил всё буквально до Create-Free, утечка всё равно присутствует.
При Button1.Click потребление памяти составляет 0 байт, при Button2.Click -- 64000 байт. А собственно, почему? Вроде всё корректно должно освобождаться...