クラスデストラクターが呼び出されたときに解放する必要があるオブジェクトを格納するために、クラス変数内の動的配列を使用すると機能しません。クラスデストラクターが呼び出される前にスコープから外れるDelphiクラス変数
配列はスコープ外になり、クラスデストラクタが呼び出される前に既に破棄されているようです。 これは仕様ですか? 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;
ない答えが、いくつかのアドバイス:使用しない
はおそらく、エンバカデロから誰かが他の方法でのラウンドは、モバイルプラットフォーム上で特にARCで、絶対にクールではないことをついに実現しましたオブジェクトの配列はTObjectList(generics.collections)ですが、リストが有効範囲外になったときにオブジェクトを解放します。 –
whosrdaddy
はい、私は知っていますが、このリークはオープンソースのスレッドプールライブラリで発生します。そのため、この言語で意図されているかどうかを知りたがっています。 – jong
心配する必要はありません、varsはクラスデストラクタの前にきれいにされています、私の答えを参照してください – whosrdaddy