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