Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Уничтожение формы и освобождение памяти


Автор: naparNIK 27.6.2012, 17:59
Есть две формы (первая создается автоматически, вторая - "вручную"). После закрытия второй формы память не освобождается, нашёл в гугле такой пример:
Форма 1
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TForm;
begin
  t := TForm2.Create(Application);
  t.Show;
end;


Форма 2
Код

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

Проблема в том, что в программе, скомпилированной на Delphi 7 все работает нормально, память освобождается, а на XE2 - нет  smile 

Автор: Illusion Dolphin 27.6.2012, 19:22
У меня всё освобождается. А что именно не освобождается? Поробуйте включить в файл проекта ReportMemoryLeaksOnShutdown :
Код

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  ххх
end.

У меня на XE2 при 32/64 всё хорошо, утечек никаких нету. 

Автор: naparNIK 27.6.2012, 19:32
При открытии второй формы потребляемая программой память возрастает. При закрытии - должна освобождаться. Но на ХЕ2 например, как было 1300 Кб после открытия второй формы так и осталось после её уничтожения. caFree - ведь должно освобождать память при закрытии?

Автор: Illusion Dolphin 27.6.2012, 19:39
Она и освобождается, просто Вы не то меряете и не тем. Скорее всего Вы меряете по диспетчеру задач, который показывает вообще виртуальную память процесса, а не физическое использование памяти. 

Автор: naparNIK 27.6.2012, 19:49
А что и чем мерять?  smile  И почему тогда при закрытии второй формы в скомпилированной на D7 программы используемая память (которая отобр. в дисп. задач) уменьшается, а на ХЕ2 не меняется? программы ведут себя по разному? 

Автор: Illusion Dolphin 27.6.2012, 19:54
Ну как минимум Process Explorer показывает более детальную информацию в разделе Perfomance. 
Различие между Delphi7/XE2 в абсолютно разном менеджере памяти - новые делфи используют FastMM, вероятно новый менеджер памяти не выделяет физическую память т.к. высвободилось совсем немного (это очень затратная по ресурсам операция).  Думаю, высвобождение будет заметно при больших объёмах памяти.

Автор: naparNIK 27.6.2012, 20:17
Цитата

Думаю, высвобождение будет заметно при больших объёмах памяти.

 smile Да, вы правы! При создании второй формы в 10 imag'ов загрузил битмапы (~50 Мб). При закрытии формы память освободилась.
Цитата

в разделе Perfomance

Я так и не нашёл его.  А чем отличаются Private Bytes от Working Set? Private Bytes - это то, что показывает диспетчер задач  (частный рабочий набор), да?

Автор: CodeMonkey 27.6.2012, 20:45
naparNIK, http://www.gunsmoker.ru/2009/05/blog-post_24.html. Там всё написано - и почему так происходит, и чем мерять, и когда кричать караул, а когда - не надо.

Автор: AlekXL 28.6.2012, 03:22
вообще , встроенный менеджер памяти не всегда отдает память системе, когда ты ее освобождаешь. У него есть свой кэш. Это если речь о небольшом блоке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)