Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.18;
Скачать: CL | DM;

Вниз

Утечка памяти на ровном месте   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.006 c
2-1322731427
Laguna
2011-12-01 13:23
2012.03.18
Контроль отправки письма по Email


15-1322384341
RDen
2011-11-27 12:59
2012.03.18
конец света отменяется


2-1323012601
xrumas
2011-12-04 19:30
2012.03.18
Работа с одномерными массивами


8-1219590082
Agent[007]
2008-08-24 19:01
2012.03.18
Direct3D


2-1322986484
I_D
2011-12-04 12:14
2012.03.18
Типизированный текстовый файл. Переход с Delphi 7 на Delphi XE