Tengo un pedazo de código de DelphiCómo liberar memoria cuando se produce una excepción fuera de la memoria en 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;
El código anterior intenta asignar una gran cantidad de memoria y out-of-memory
van a detener. Se ejecutará a=nil
, pero la memoria no se libera.
¿Hay alguna forma de liberar la memoria en el caso de una excepción de falta de memoria?
Intenté SetLength(a, 0, 0, 0)
y Finalize(a)
, y ambos tampoco funcionarán.
Cuando está en el manejador de excepciones, ¿'a' incluso tiene un valor no nulo? Si no, entonces no se puede esperar poder liberarlo. Además, se liberará al final de la función de todos modos. ¿Has confirmado que 'SetLength' establece la variable' a' cuando no puede terminar de asignar toda la memoria solicitada? –
@Rob No, 'a' es' nil' en el manejador de excepciones. –
Sí, a = nil cuando el código entra al bloque de excepción. PD: utilicé FastMM como administrador de memoria. –