2010-06-24 12 views
14

en este ejemplo¿Se desasigna automáticamente una matriz dinámica cuando se sale del alcance?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

es la matriz destruido o la memoria tiene una fuga?

+0

Si bien puede no tener fugas, realmente debería liberar sus propias variables. Hacer el SetLength (pestaña, 0); es una línea adicional. Si está preocupado, envuélvalo en un bloque try/finally. –

+2

No puedo respaldar ese consejo, @Ryan. ¿Borras manualmente todas tus variables de cadena también? Cuando veo que el código asigna valores a variables que nunca vuelven a usarse, me dice que el programador no entiende realmente cómo funciona el lenguaje. En particular, el compilador ya coloca un bloque try-finally alrededor del cuerpo de la función para garantizar que la variable dynamic-array se limpie. Poner uno propio es excesivo. –

+0

@Ryan, eso está mal. La llamada a SetLength es un desperdicio total, tanto de pulsaciones de teclas como una llamada de función innecesaria en tiempo de ejecución. Los arreglos dinámicos son gestionados por el compilador y se liberarán automáticamente cuando salgan del alcance. –

Respuesta

14

La memoria está libre. (¡Es decir, no hay pérdida de memoria!)

+4

Los elementos también se liberan si también los gestiona el compilador (dyn arrays, strings, intf, registros con dichos tipos, etc.). – alex

+1

Para "tab: array of Integer", todo se libera. Para "tab: array of TObject", o cualquier otra clase, debe liberar los Objects usted mismo. –

+0

Es cierto, @Warren, pero eso no tiene nada que ver con la matriz. El mismo consejo se aplica a un escalar ordinario. Los objetos necesitan ser liberados; los enteros no. –

1

La matriz se libera automáticamente, pero he visto casos poco claros en los que no es por alguna razón. Lo resolví estableciendo la matriz en cero.

+6

Existen solo dos razones por las que no se liberarán. O bien, estás haciendo algo aterrador con punteros que estropea el recuento de referencias, o la matriz es propiedad de un objeto o registro que también está goteando. –

+0

Lo sé, de alguna manera había algo más que causaba que no se auto-libre. ¡Ojalá todavía tuviera el ejemplo para probarlo! Pero yo no. –

+0

Eso sería un error en el código-gen del compilador. O tal vez fue un threadvar? La ayuda indica claramente que el tipo gestionado utilizado como threadvars no se liberará automáticamente y deberá hacerlo manualmente. –

Cuestiones relacionadas