L'utilizzo dell'array dinamico in una variabile di classe per archiviare oggetti che devono essere liberati quando viene chiamato il distruttore di classe non funziona.Variabile di classe Delphi che esce dall'ambito prima che il distruttore di classe venga chiamato
La matrice sembra essere stata esclusa dall'ambito e già eliminata prima che venga chiamato il distruttore di classe. È questo in base alla progettazione?
Esempio testato in 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;
Non una risposta, ma un consiglio: non usare array per oggetti, ma TObjectList (generics.collections), libererà gli oggetti per te quando l'elenco non rientra nello scope. –
whosrdaddy
Sì, lo so, ma questa perdita si verifica in una libreria di pool di thread open source, quindi volevo sapere se questo è come previsto dalla lingua prima di dare un'occhiata. – jong
non c'è bisogno di preoccuparsi, i vars vengono puliti prima del distruttore di classe, vedere la mia risposta – whosrdaddy