首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何释放Delphi 7析构函数中的对象数组?

我应该如何释放Delphi 7析构函数中的对象数组?
EN

Stack Overflow用户
提问于 2009-02-12 23:44:34
回答 8查看 17.6K关注 0票数 9

假设我的Delphi类如下所示:

代码语言:javascript
复制
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吗?我需要做些什么吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-12 23:50:16

您需要遍历并释放每个创建的对象。

您必须知道,声明一个TMySubInfo数组实际上并不会创建对象。您必须在以后创建它们。

对于更动态的方法,我会使用TList。您甚至可以使用一个TObjectList,它可以在列表被释放时释放它的所有项。

票数 12
EN

Stack Overflow用户

发布于 2009-02-13 00:07:38

您应该释放每一项,如下所示

代码语言:javascript
复制
destructor TMyInfo.Destroy;
var
  I: Integer;
begin
  for I:= Low(SubInfo) to High(SubInfo) do
   SubInfo[I].Free;
  SetLength(SubInfo, 0); 
  inherited;
end;
票数 9
EN

Stack Overflow用户

发布于 2009-02-13 00:08:53

释放对象的方式与分配对象的方式相同。如果通过调用类的构造函数来分配元素的值,则释放该元素引用的对象。

代码语言:javascript
复制
destructor TMyInfo.Destroy;
var
  info: TMySubInfo;
begin
  for info in SubInfo do
    info.Free;
  inherited;
end;

它使用了Delphi2005中引入的语法。如果您有较旧的版本,请使用显式循环控制变量:

代码语言:javascript
复制
var
  i: Integer;
begin
  for i := 0 to High(SubInfo) do
    SubInfo[i].Free;

你不需要在最后调用SetLength。当对象被销毁时,像SubInfo这样的动态数组字段会自动释放。它与接口、字符串和变量字段的工作方式相同。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/544075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档