Установил FastMM.
сделал тестовое приложение:
+ |
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,bisneslogik;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
procedure FormCreate(Sender: TObject);
procedure ButonXclick(Sender:TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
desk:Tdesk;
pole1:tpole;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer; btcur:TButton;
begin
//create new field
desk := tdesk.create;
pole1:= tpole.create(77);
for i:=1 to 8 do
for j:=1 to 8 do
begin
btcur := TButton.Create(panel1);
btcur.Width:=50;
btcur.Height := 50;
btcur.Tag := i*8+j-8;
btcur.name := 'Button'+inttostr(btcur.tag);
btcur.Top := i*60-55;
btcur.Left := j*60-55;
if (i+j)mod 2 >0 then
btcur.Brush.Color := clYellow else
btcur.Brush.Color := clblack;
btcur.OnClick := ButonXclick;
{ case desk.fpole[btcur.Tag].in_cell of
BlackKaptain: btcur.Font.Color := clRed;
BlackLeitenaunt: btcur.Font.Color := clRed - $111111;
BlackSolder: btcur.Font.Color := clRed-$333333;
WhiteSolder: btcur.Font.Color := clGreen;
whiteLeitenaunt: btcur.Font.Color := clGreen- $111111;
WhiteKaptain: btcur.Font.Color := clGreen-$333333;
Empty : btcur.Font.Color := clBlue;
end;}
btcur.Parent := panel1;
end;
end;
procedure TForm1.ButonXclick(Sender:TObject);
begin
if sender is Tbutton then
panel2.Caption := inttostr(Tbutton(Sender).Tag);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
desk.Free;
pole1.Free;
end;
end.
|
+ |
unit bisneslogik;
interface
uses SysUtils;
type
TinCellType = (BlackKaptain,BlackLeitenaunt,BlackSolder,Empty,WhiteSolder,whiteLeitenaunt,WhiteKaptain);
Tpole= class
id:integer;
xcor,ycor:integer;
in_cell: TinCellType;
public
constructor create(a:integer);
//destructor destroy;
end;
Tdesk=class
fpole : array [1..64]of Tpole;
public
constructor create;
destructor destroy;
end;
implementation
uses Math;
constructor Tpole.create(a:integer);
begin
inherited create;
id:=a;
xcor:=(a-1) mod 8 +1;
ycor := (a-1) div 8 +1;
in_cell := Empty;
end;
{destructor Tpole.destroy;
begin
inherited;
end;
}
constructor Tdesk.create;
var i,j:integer;
begin
inherited create;
for i:=1 to 8 do
for j:=1 to 8 do
begin
fpole[i*8+j-8]:=Tpole.create(i*8+j-8);
if i<3 then fpole[i*8+j-8].in_cell := BlackSolder;
if i>6 then fpole[i*8+j-8].in_cell := WhiteSolder;
end;
end;
destructor Tdesk.destroy;
var j:integer;
begin
for j:=1 to 64 do FreeAndNil(fpole[j]);
inherited;
end;
end.
|
при уничтожении объекта - закрытие сразу после запуска, получаю ругательство о утечке 20 байт 64 раза в Tpole.
for j:=1 to 64 do FreeAndNil(fpole[j]);
пробовал менять на
for j:=1 to 64 do fpole[j].Free;
картина та же.
после подстановки в классе Tdesk
destructor destroy; override;
утечка пропадает.
Вопрос: в чем моя ошибка при работе с классом Tdesk?
мое понимание, что вместо перезагрузки метода делал его замену, и этим терял очистку указателей fpole.
так ли это?
с классами и ошибками при работе с ними пытаюсь щас разбираться. Если понял не верно, пожалуйста подправьте.
спасибо.