Ho un pezzo di codice DelphiCome liberare la memoria quando si verifica Out-of-memory eccezione in Delphi usando SetLength
var
a: array of array of array of integer;
begin
try
SetLength(a, 100000, 100000, 10000); // out of memory here
doStuffs(a);
except
a = nil; // try to free the memory
end;
end;
Il codice di cui sopra tenta di allocare molta memoria e saranno catturati out-of-memory
. Il a=nil
verrà eseguito, ma la memoria non viene liberata.
C'è un modo per liberare la memoria nel caso di un'eccezione di memoria insufficiente?
Ho provato SetLength(a, 0, 0, 0)
e Finalize(a)
, ed entrambi non funzioneranno neanche.
Quando sei nel gestore di eccezioni, 'a' ha anche un valore non nullo? In caso contrario, non puoi certo aspettarti di essere in grado di liberarlo. Inoltre, sarà comunque liberato alla fine della funzione. Hai confermato che "SetLength" imposta la variabile 'a' quando non riesce a terminare l'allocazione di tutta la memoria richiesta? –
@Rob No, 'a' è' nil' nel gestore delle eccezioni. –
Sì, a = zero quando il codice entra nel blocco di eccezioni. PS: ho usato il FastMM come gestore della memoria. –