我应该在 Delphi 中写入对所有字段的析构函数的析构函数调用吗?
Should I write in the destructor call to all it's fields' destructors in Delphi?
TB = Class;
TC = Class;
TA = Class
Strict Private
B : TB;
C : TC;
Public
Constructor Create;
Destructor Destroy; Override;
//something
End;
//something
Constructor TA.Create;
B := TB.Create;
C := TC.Create;
End;
Destructor TA.Destroy;
B.Free;//needed?
C.Free;//needed?
End;
是否需要调用 Free class' 析构函数中的所有字段,或者不需要但冗长是一种很好的风格?
在您提供的示例代码中,您确实必须销毁您创建的对象。这是一般规则。
如果您的对象继承自 TComponent
,并且当您调用 constructor
传递所有者时,则该所有者负责销毁该组件。但是你可以 - 如果你愿意 - 也可以在你的 destructor
.
中释放它
如果创建对象是因为它们被分配给类型为 interface
的变量(由对象实现),那么您不应该销毁(释放)它。这是因为接口是引用计数的,如果没有更多引用,对象会自动释放。当然,该对象必须正确实现引用计数(TInterfacedObject
是一个基数 class,如果您不想为引用计数而烦恼,您可以将其用作祖先。但那是另一回事了)。
TB = Class;
TC = Class;
TA = Class
Strict Private
B : TB;
C : TC;
Public
Constructor Create;
Destructor Destroy; Override;
//something
End;
//something
Constructor TA.Create;
B := TB.Create;
C := TC.Create;
End;
Destructor TA.Destroy;
B.Free;//needed?
C.Free;//needed?
End;
是否需要调用 Free class' 析构函数中的所有字段,或者不需要但冗长是一种很好的风格?
在您提供的示例代码中,您确实必须销毁您创建的对象。这是一般规则。
如果您的对象继承自 TComponent
,并且当您调用 constructor
传递所有者时,则该所有者负责销毁该组件。但是你可以 - 如果你愿意 - 也可以在你的 destructor
.
如果创建对象是因为它们被分配给类型为 interface
的变量(由对象实现),那么您不应该销毁(释放)它。这是因为接口是引用计数的,如果没有更多引用,对象会自动释放。当然,该对象必须正确实现引用计数(TInterfacedObject
是一个基数 class,如果您不想为引用计数而烦恼,您可以将其用作祖先。但那是另一回事了)。