Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти на ровном месте [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 байт. А собственно, почему? Вроде всё корректно должно освобождаться...


Наверх

Титульная страница Поиск, карта сайта Написать письмо