一个类应该在哪里释放它的私有变量?

时间:2010-02-01 15:08:13

标签: delphi memory-management garbage-collection

由于Delphi中没有垃圾收集,你究竟在哪里卸载变量?

假设我有一组包含私有变量的类型。 是否有足够的Destroy方法可以完成这项工作? 我是否需要在我的消费类中显式调用此destroy方法?

4 个答案:

答案 0 :(得分:10)

在delphi中组织破坏的最好方法是始终考虑“谁将创建给定的变量”。

如果你也在这个上下文中释放它们(对于私有变量类的destroy方法),你遇到内存泄漏的可能性要小得多。

实际上,类的析构函数通常不会通过

调用
myInstance.Destroy();

相反,典型的做法是通过

FreeAndNil(myInstance);

myInstance.Free();

因为delphi将处理按顺序调用析构函数方法

答案 1 :(得分:4)

当你准备好对象时,需要销毁它们:usingFree(调用析构函数.Destroy)或FreeAndNil。

如果您正在使用接口:它们是引用计数,因此它们可以为您释放。字符串相同。

传递对象所需的大多数函数都不会获取对象的所有权,因此您在完成对象后应该将其释放。如果您在表单上创建组件,请注意它们是对象,由表单拥有,您应该让表单为您释放它们。

例如:在您的TLight中,您可能创建了一个可能没有所有者的TTimer。在这种情况下,您应该在TLight类的析构函数中释放计时器。如果您的TLight本身就是TControl或TComponent,那么您可以创建Timer with Self作为所有者,并在释放TLight实例时自动释放它。

答案 2 :(得分:3)

我就是这样看的:

原始类型(如整数,真实,双重,扩展),数组,集合,记录:超出范围时会自动销毁它们。

引用计数类型(字符串,接口类型,接口引用):当它们的引用计数器等于零时,它们会自动销毁。

来自其中一种情况的类的对象:不是从TComponent下降,是在没有实现所有权的列表对象中,或者是TComponent后代但没有为其分配所有者

  • 当他们的类从TInterfacesObject下降并从接口引用访问时:来自引用计数器类型的相同行为(参见上文)
  • 其他情况:调用Object.Free或FreeAndNil(Object)手动销毁它(在try..finally结构中会更好)

拥有所有者的对象(TComponent后代或位于实现所有权的列表对象中):所有者将在适当的时间内使用它们。

我注意到OP的以下评论:

  

我注意到了所有者的概念。   但我无法通过我的自定义课程   原样是TTimer.Create()方法   期待一个TComponent。为什么呢   限制表格中使用的东西   只要?不是那个石化石化了   将逻辑放入你的习惯的坏习惯   观点(表格)?

请参阅,可以在托盘上注册TComponent后代 ,以便能够在设计时使用(例如,在表单中)。但这并不意味着必须 !! 您可以将自定义类传递给TTimer.Create(),如果它从TComponent下降但您不需要在设计时实例化 - 或者甚至由TForm后代拥有(如果您想管理它的生命周期,那么您甚至不需要主人!)。

所有权是一种帮助人们节省时间的机制....

答案 3 :(得分:1)

你一直指的是“带有私有变种的类型”,并询问“卸载变量”。我将要走出困境(因为我可能误解了你的消息),并且假设你正在讨论类变量,并且询问何时应该在“类卸载”时最终确定这些类变量。 (你一直在做Java或.NET编程,没有; - )。

您要问的关键是单元定稿部分。单元的整体布局包括4个整体部分,其中两个部分是可选的,初始化和最终确定。

unit Foo;
interface
  // put things here you want other units to see
implementation
  // put the *implementation* of the things from the interface here along with things
  // you only want this unit to see.
initialization
  // <optional> put code here that you want to execute when this unit is "loaded"
finalization
  // <optional> put code here that you want to execute when this unit is "unloaded"
end.

如果你在谈论类类型的实例变量,那么你已经获得的一些其他答案(并且必然会得到)应该对此有所了解。