我需要释放动态创建的表单吗?

yco*_*omp 4 delphi memory-management

如果我使用 TForm.CreateNew(Application) 动态创建一个 TForm 来制作一个自由浮动的窗口,我是否必须跟踪这些对象并在应用程序关闭时释放它们?

或者德尔福会在应用程序关闭时自动释放所有表单?

另外,如果我有一个自由浮动的动态创建的表单并且用户点击关闭按钮会发生什么?我需要在某处调用一些代码来释放它们吗?
如果是这样,如何?我想我不能把它放在任何表单的事件中。

Dis*_*ned 5

只是为了触及其他答案中未涵盖的重要观点......

是的,当您创建具有所有者的表单(或任何其他组件)时,它会在所有者被销毁时被销毁。
但是,非常注意: 这并不意味着您不会泄漏。澄清:

  • 如果每次创建表单时都将其设置Application为所有者,那么Application当您的应用程序关闭时,表单将被对象销毁。
  • 但是(除非您编写额外的代码),这些表单只会在应用程序关闭时被销毁。
  • 换句话说,如果每次您的用户选择一个特定的菜单项时,您都会创建一个由应用程序拥有的特定表单,那么随着时间的推移将消耗更多的内存。根据每次创建表单时使用的内存量,您的应用程序可能会耗尽内存。

因此,只要您不不断地重新创建对象,该模型是完全可以接受的。但是,这意味着您确实希望跟踪这些对象。但不是这样你就可以自己释放它们,而是这样你就可以重新Show创建它们而不是重新创建它们。


还要涵盖您问题中的其他一些要点:

如果我有一个自由浮动的动态创建的表单窗口并且用户点击关闭按钮会发生什么?我需要在某处调用一些代码来释放它们吗?

如果下次您的用户显示您重用现有实例的表单时,您不需要释放它们。如果您要创建一个新实例,那么您应该在关闭表单时释放它。否则所有旧实例只会在您的应用程序关闭时被销毁。

如何?我想我不能把它放在任何表单的事件中。

碰巧的是,Delphi 提供了一个理想的事件:OnClose. 如果您挂钩该事件,则可以设置var Action: TCloseAction以指示表单关闭时应发生的情况。默认情况下:

  • MDI 表单将被最小化 ( caMinimize)。
  • 并且 SDI 表单将被隐藏 ( caHide)。

您可以更改此设置以破坏表单 ( caFree)。

注意:如果您决定销毁表单,请注意不要在销毁后尝试重新使用它。任何指向表单的变量都将指向内存中的相同位置,但表单不再存在。