我一直以为所有者(owner)负责销毁视觉控件,如果我将nil
作为所有者传递,则可以手动控制销毁。
考虑以下示例:
TMyForm = class (TForm)
private
FButton : TButton;
end;
...
FButton := TButton.Create(nil); // no owner!!
FButton.Parent := Self;
我本来期望这个按钮会导致内存泄漏,但实际上没有,而且TButton
的析构函数被调用了。
进一步的调查显示,TWinControl
的析构函数包含以下代码片段:
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
这个问题似乎破坏了子组件(那些具有将Parent
设置为该控件本身的组件)。
我没想到父控件会销毁该控件。有人能解释一下为什么会发生这种情况吗?如果我传入一个所有者,是谁在销毁对象?
TComponent.DestroyComponents
(从析构函数调用)在您不设置父级而是所有者时进行销毁。我从未注意到销毁也可以发生在TWinControl
中,这很好知道。 - Heinrich Ulbricht