【发布时间】:2011-10-27 21:15:57
【问题描述】:
我一直认为,销毁可视化控件是所有者负责的,如果我将nil作为所有者传递,我可以手动控制销毁。
考虑以下示例:
TMyForm = class (TForm)
private
FButton : TButton;
end;
...
FButton := TButton.Create(nil); // no owner!!
FButton.Parent := Self;
我希望这个按钮会产生内存泄漏,但它不会,实际上调用了TButton 的析构函数。
进一步调查表明,TWinControl 析构函数包含以下 sn-p 代码:
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
看起来它正在破坏子组件(Parent 设置为控件本身的组件)。
我没想到父控件会破坏控件。谁能解释为什么会这样?如果我传入所有者,谁在销毁该对象?
【问题讨论】:
-
TComponent.DestroyComponents(从析构函数调用)在您不设置父对象但设置所有者时进行销毁。我从来没有注意到TWinControl也会发生破坏,这很高兴知道。 -
在问题How to detach a panel and show it in a separate window? 中有些类似的混淆。 TControl.Parent Property 的“注释”中有解释,但我觉得解释有点混乱(关于流媒体部分)..
标签: delphi memory-management components delphi-xe ownership