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?
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?
La memoria está libre. (¡Es decir, no hay pérdida de memoria!)
Los elementos también se liberan si también los gestiona el compilador (dyn arrays, strings, intf, registros con dichos tipos, etc.). – alex
Para "tab: array of Integer", todo se libera. Para "tab: array of TObject", o cualquier otra clase, debe liberar los Objects usted mismo. –
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. –
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.
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. –
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. –
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. –
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. –
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. –
@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. –