请考虑以下示例:
TMyForm = class (TForm)private Fbutton : Tbutton;end;...Fbutton := Tbutton.Create(nil); // no owner!!Fbutton.Parent := Self;
我会期望这个按钮产生内存泄漏,但它并不实际上是Tbutton的析构函数。
进一步调查显示,TWinControl析构函数包含以下代码片段:
I := ControlCount;while I <> 0 dobegin 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);
,该实例将从父级子控件列表中删除该实例。这就是为什么父进程不会在析构函数中再次释放你的对象。
以上是内存溢出为你收集整理的德尔福所有权混乱全部内容,希望文章能够帮你解决德尔福所有权混乱所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)