加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

德尔福所有权混乱

发布时间:2020-12-15 10:18:31 所属栏目:大数据 来源:网络整理
导读:我一直认为,所有者负责销毁视觉控制,如果我作为所有者通过,我可以手动控制销毁。 请考虑以下示例: TMyForm = class (TForm)private FButton : TButton;end;...FButton := TButton.Create(nil); // no owner!!FButton.Parent := Self; 我会期望这个按钮产
我一直认为,所有者负责销毁视觉控制,如果我作为所有者通过,我可以手动控制销毁。

请考虑以下示例:

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;

看起来它正在破坏子组件(父组设置为控件本身)。

我并不期望父母的控制能够摧毁控制权。任何人都可以解释为什么会发生这种情况?如果我通过业主,谁在摧毁对象?

解决方法

why this is happening?

它是有意义的,它是设计。当父母被毁坏时,你认为孤儿控制会发生什么?他们应该突然开始浮动在顶级窗口?可能不会。他们应该重新接受另一个控制吗?哪一个?

who is destroying the object if I pass in an owner?

父母,如果被分配并被首先释放。 TWinControl首先覆盖TComponent的析构函数,以释放其子控件(继承的析构函数仅在后面被调用)。孩子控制notify他们的主人被毁坏,从他们所有的组件列表中删除它们。这就是为什么所有者不会在其析构函数中尝试再次释放你的对象。

如果父对象与所有者相同,则上述也适用。

如果父母和所有者是两个不同的对象,并且首先释放所有者,则所有者组件将释放其所有的所有组件(参见TComponent‘s destructor)。您的对象是TControl后代,TControl将覆盖析构函数,调用SetParent(nil);,该实例将从父级子控件列表中删除该实例。这就是为什么父进程不会在析构函数中再次释放你的对象。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读