我的环境:
C++ Builder 10.2 Tokyo on Windows 10 v1809
我对TControl.Parent属性有疑问。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPanel *pnlptr = new TPanel(/*AOwner=*/this);
TLabel *lblptr = new TLabel(/*AOwner=*/this);
lblptr->Parent = pnlptr;
// some processing
//delete lblptr;
delete pnlptr;
}
上面的代码是否释放了lblptr?
在文档中(尽管适用于2009年) TControl.Parent Property
注意:TControl中声明的Parent属性与TComponent中声明的Owner属性相似,因为控件的Parent会释放控件,就像组件的所有者释放该Component一样。
有了笔记,我认为当pnlptr被释放时,lblptr也被释放而没有delete lblptr
。
这对吗?
答案 0 :(得分:1)
上面的代码是否释放了lblptr?
是的,确实如此。释放TPanel
时,其基础TWinControl
的析构函数将释放仍在Controls[]
属性中的所有组件(将TWinControl
设置为其Parent
的控件):
destructor TWinControl.Destroy;
var
I: Integer;
Instance: TControl;
begin
...
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy; // <-- FREED HERE
I := ControlCount;
end;
...
end;