2012-05-18 13 views
10

Hace poco estaba buscando un código que utiliza SetLength para asignar memoria para una matriz de bytes, pero no vi ninguna lógica para liberar ese espacio de memoria. He leído que para una serie de bytes, ¿debe establecer el valor en cero o utilizar Finalizar?Al usar SetLength() en Delphi, ¿cuál es la forma correcta de desasignar esa memoria?

¿Cuál es la mejor manera de manejar esto ... Sobre la base de lo que he encontrado que sugiere algo como lo siguiente ...

var 
    x: array of byte; 
begin 
    SetLength(x, 30); 
    // Do something here 
    : 
    // Release the array 
    x := nil; 
    Finalize(x); 
end; 

Respuesta

23

Normalmente, no es necesario para liberar la memoria en absoluto, ya que esto se hace automáticamente cuando el identificador (en este caso, x) sale del alcance. Por lo tanto, las dos últimas líneas en su código son completamente sin sentido.

Sin embargo, si tiene un identificador que no sale de alcance hasta, por ejemplo, que su programa se está cerrando, entonces puede desear liberar la memoria asociada a él manualmente. En particular, es posible que desee hacer esto si el identificador es una imagen de mapa de bits grande o algo así. Entonces podría hacer x := nil, SetLength(x, 0) o algo así.

9

Los arreglos dinámicos son tipos administrados. Esto significa que el compilador eliminará la memoria cuando la última referencia a la matriz quede fuera del alcance. Eso significa que el código para liberar la matriz en su código es bastante inútil.

Si es necesario, se puede anular la planificación de la matriz antes de tiempo mediante el uso de cualquiera de estas líneas equivalentes de código:

SetLength(x, 0); 
Finalize(x); 
x := nil; 

Mira que si tiene mutiple referencias a la misma matriz, entonces necesita hacer esto para todas las referencias a esa matriz.

Cuestiones relacionadas