Heja
Tak sobie trochę kodzę w niedzielny poranek i natrafiłem na coś dziwnego. Opiszę na prostym przykładzie.
Rzecz dzieje się pod Turbo Delphi:
New > VCL Application ...
Na form1 mam combobox1. W OnCreate formy robię:
ComboBox1.AddItem('asdf', TObject.Create);
w dpr'ce na początku dałem
ReportMemoryLeaksOnShutdown := True;
Jak na tym zakończę to przy zamykaniu formatki jest komunikat o wycięku pamięci TObject x 1 - OK.
No to w OnDestroy dałem (wiem że brzydko ale to żeby pokazać):
ComboBox1.Items.Objects[0].Free;
I wyciek znika - wszystko cacy.
Ale teraz dodaje Frame'a do aplikacji. Na Frame'ie daję combo'sa. Tworze dwie procki:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrame2 = class(TFrame)
ComboBox1: TComboBox;
public
{ Public declarations }
constructor Create(aOwner : TComponent); override;
destructor Destroy; override;
end;
implementation
{$R *.dfm}
constructor TFrame2.Create(aOwner: TComponent);
begin
inherited;
ComboBox1.AddItem('adf', TObject.Create);
end;
destructor TFrame2.Destroy;
begin
// ComboBox1.Items.Objects[0].Free; // jaja
inherited;
end;
end.
Kladę tego Freme'ana form1 i odpalam program. I co 1 raz leak: TObject x 1. Okazuje się że w destruktorze frame'a ComboBox1.Items.Count = 0 ! Więc jak zwolnić obiekt ? Jak to robić przy frame'ach ? Sam się ten TObject nie zwolni, więc ReportMemoryLeak pokazuje raczej dobrą informację. Jakbym zwalniał ten TObject w destruktorze formatki głównej to by było OK. Tam Frame1.Combobox1.Items.Count = 1, ale wtedy psu na bude cała idea frame'ów. Skoro tworze coś w unicie z framem to tam chce to zwalniać ... Eh - co ja robie źle ?
Pozdrawiam