假设我的Delphi类如下所示:
interface
type
TMySubInfo = class
public
Name : string;
Date : TDateTime;
Age : Integer;
end;
TMyInfo = class
public
Name : string;
SubInfo : array of TMySubInfo;
destructor Destroy; override;
end;
implementation
destructor TMyInfo.Destroy;
begin
// hmmm..
end;
end.要正确清理,析构函数中应该包含什么内容?做SetLength(SubInfo,0)就足够了吗?或者我需要遍历并释放每个TMySubInfo吗?我需要做些什么吗?
发布于 2009-02-12 23:50:16
您需要遍历并释放每个创建的对象。
您必须知道,声明一个TMySubInfo数组实际上并不会创建对象。您必须在以后创建它们。
对于更动态的方法,我会使用TList。您甚至可以使用一个TObjectList,它可以在列表被释放时释放它的所有项。
发布于 2009-02-13 00:07:38
您应该释放每一项,如下所示
destructor TMyInfo.Destroy;
var
I: Integer;
begin
for I:= Low(SubInfo) to High(SubInfo) do
SubInfo[I].Free;
SetLength(SubInfo, 0);
inherited;
end;发布于 2009-02-13 00:08:53
释放对象的方式与分配对象的方式相同。如果通过调用类的构造函数来分配元素的值,则释放该元素引用的对象。
destructor TMyInfo.Destroy;
var
info: TMySubInfo;
begin
for info in SubInfo do
info.Free;
inherited;
end;它使用了Delphi2005中引入的语法。如果您有较旧的版本,请使用显式循环控制变量:
var
i: Integer;
begin
for i := 0 to High(SubInfo) do
SubInfo[i].Free;你不需要在最后调用SetLength。当对象被销毁时,像SubInfo这样的动态数组字段会自动释放。它与接口、字符串和变量字段的工作方式相同。
https://stackoverflow.com/questions/544075
复制相似问题