Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1323244056
Дмитрий_
2011-12-07 11:47
2012.03.18
восстановить курсор если найдена запись


2-1322915643
Gu
2011-12-03 16:34
2012.03.18
const в переменных


15-1322068711
Y
2011-11-23 21:18
2012.03.18
Как стать продвинутым пользователем?


2-1322726859
Faceless
2011-12-01 12:07
2012.03.18
TBucketList


15-1322339776
Vyacheslav
2011-11-27 00:36
2012.03.18
Какую версию Delphi используете в Windows 7 64bit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский