Delphi 类变量在调用类析构函数之前超出范围

标签 delphi class variables memory-leaks destructor

在类变量中使用动态数组来存储调用类析构函数时需要释放的对象是行不通的。

该数组似乎超出了范围,并且在调用类析构函数之前已被释放。 这是设计使然吗?

在 XE5 中测试的示例:

type
  TLeakingObject = class
  public
    I : Integer;
  end;

  TTheLeakOwner = class
  public
    class var OutofScopeArray:array of TLeakingObject;
    procedure Add;
    class destructor Destroy;
  end;

procedure TestThis;
var LeakingTest : TTheLeakOwner;
begin
  LeakingTest := TTheLeakOwner.Create;
  try
    LeakingTest.Add;
  finally
    LeakingTest.DisposeOf;
  end;
end;

{ TTheLeakOwner }

procedure TTheLeakOwner.Add;
begin
  setlength(OutofScopeArray, length(OutofScopeArray) + 1);
  OutofScopeArray[length(OutofScopeArray) - 1] := TLeakingObject.Create;
end;

class destructor TTheLeakOwner.Destroy;
var I: Integer;
begin
  // Length(OutofScopeArray) always = 0, gone out of scope before class destructor ??
  for I := 0 to Length(OutofScopeArray) - 1 do
    FreeAndNil(OutofScopeArray[i]);
end;

最佳答案

类析构函数在单元终结后调用,因此这意味着在调用类析构函数时数组不再存在。在单元完成时,所有托管变量都由 RTL 清除。最终这应该不重要,因为它并不是真正的泄漏。

Allen Bauer 提供了有关类构造函数/析构函数的更多信息 here .

编辑

显然这是 design 的作者

关于Delphi 类变量在调用类析构函数之前超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19332847/

相关文章:

delphi - 重新安装Windows而不重新注册Delphi

delphi - 如何在Delphi中正确使用IFileOperation删除文件夹中的文件

delphi - 将 Delphi 窗体最小化到系统托盘

java - 如何安全地更改变量 intellij 的类型?

java - android textview 变量

delphi - 使用VCL对接: How to make vertically docked Forms prevail over horizontally docked Forms?

javascript - Jquery如何更改点击链接的类别

c++ - vector 中存储的对象,它们何时被销毁?

java - 驱逐java中的类?

python - 在python中将两个字符串相加