相关疑难解决方法(0)

德尔福所有权混乱

我一直认为所有者负责销毁视觉控制,如果我nil作为所有者传递,我可以手动控制销毁.

请考虑以下示例:

TMyForm = class (TForm)
private
  FButton : TButton;
end;

...
FButton := TButton.Create(nil);   // no owner!!
FButton.Parent := Self;
Run Code Online (Sandbox Code Playgroud)

我希望这个按钮产生内存泄漏,但它没有,实际上是析构函数TButton被调用.

进一步调查显示TWinControl析构函数包含以下代码片段:

I := ControlCount;
while I <> 0 do
begin
  Instance := Controls[I - 1];
  Remove(Instance);
  Instance.Destroy;
  I := ControlCount;
end;
Run Code Online (Sandbox Code Playgroud)

看起来它正在摧毁子组件(Parent设置为控件本身的组件).

我没想到父控件会破坏控件.任何人都可以解释为什么会这样吗?如果我通过一个所有者,谁在摧毁这个物体?

delphi components memory-management ownership delphi-xe

24
推荐指数
2
解决办法
2680
查看次数