Может быть я не правильно создаю/уничтожаю компоненты?
Или это особенности работы менеджера памяти FPC ? Если это менеджер памяти такой - может быть есть способ запустить "сборку мусора"?
В приведенном ниже примере:
- запуск приложения: 3472kB
- после создания компонентов: 10220kB
- после уничтожения компонентов: 9708kB
Как вернуть системе эти 6 мегабайт?
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton; //Показать использование памяти
Button2: TButton; //Создать компоненты
Button3: TButton; //Уничтожить компоненты
Label1: TLabel;
ScrollBox1: TScrollBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
begin
{$IFDEF UNIX}
sl:= TStringList.Create;
sl.LoadFromFile('/proc/self/status');
sl.NameValueSeparator:= ':';
Label1.Caption:= Trim(sl.Values['VmData']);
sl.Free;
sl:= nil;
{$ENDIF}
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ctrlChild: TEdit;
lCntr: Longint;
begin
ScrollBox1.AutoScroll:= False;
for lCntr:= 1 to 1000 do
begin
ctrlChild:= TEdit.Create(ScrollBox1);
ctrlChild.Name:= 'ctrl' + IntToStr(lCntr);
ctrlChild.Top:= ctrlChild.Height * (lCntr - 1);
ctrlChild.Text:= 'ctrl' + IntToStr(lCntr);
ctrlChild.Parent:= ScrollBox1;
end;
ScrollBox1.AutoScroll:= True;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
lCntr: Longint;
begin
ScrollBox1.AutoScroll:= False;
for lCntr:= ScrollBox1.ComponentCount downto 1 do
begin
ScrollBox1.Components[lCntr - 1].Free;
end;
ScrollBox1.AutoScroll:= True;
end;
end.
Пробовал на Lazarus 0.9.30 GTK2, Debian/Ubuntu i386/amd64.