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

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

在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;

最佳答案

类析构函数称为AFTER单元终结,因此这意味着在调用类析构函数时Array不再存在。在单元完成时,所有托管变量均由RTL清除。最后,这并不重要,因为它实际上并不是泄漏。

Allen Bauer提供了有关类构造器/析构器here的更多信息。

编辑

显然这是由design

08-25 03:12