Supongamos que al inicio se crea una aplicación con algunos formularios y solo un módulo de datos. En el evento DM1.OnCreate
, se crea un TStringList
para ser utilizado en tiempo de ejecución. Sabemos que cuando se finaliza la aplicación, todas las cosas se destruirán y la memoria se liberará automáticamente. Liberar algo puede llevar algo de tiempo, por lo que no siempre se recomienda preocuparse por las pérdidas de memoria al apagar. Ver por ejemplo this answer de Barry Kelly o this post de Raymond Chen.¿Existe, además de buscar fugas de memoria, otra situación en la que debería liberar todos los objetos al destruir una aplicación?
Además de eso, FastMM informa de la pérdida de memoria si no agrego TStringList.Free
a DM1.OnDestroy
. Esto resulta ser un problema cuando busco cualquier otra fuga de memoria que deba preocuparme por realmente.
Básicamente, estoy preguntando si/por qué/cuándo debería liberar instancias de objeto que serán liberadas por la aplicación o el sistema operativo (Windows en este caso específico). ¿Hay algún otro caso válido que no sea cuando se buscan fugas de memoria?
NOTA: En este caso específico, el módulo de datos no se crea ni se vuelve a crear más veces. No habrá ninguna pérdida de memoria, además de la. La fuente de desechos del módulo de datos:
unit UDM1;
interface
uses SysUtils, Classes, ...;
type
TDM1 = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DoStuffWithStringList1(Sender: TObject);
private
internalStL: TStringList;
end;
var
DM1: TDM1;
implementation
procedure TDMInterfacePAFECF.DataModuleCreate(Sender: TObject);
begin
internalStL := TStringList.Create();
end;
procedure TDMInterfacePAFECF.DataModuleDestroy(Sender: TObject);
begin
internalStL.Free; //<-- IS THIS NECESSARY OR ADVISED?
end;
procedure DoStuffWithStringList(Sender: TObject);
begin
//Place some code using internalStL here...
end;
has olvidado "end." al final (: es broma, siempre libero la memoria que estoy asignando, pero así soy yo, es cierto que Windows se lo liberará al salir de la aplicación, pero también es cierto que en muchos casos nunca se sabrá por Asegúrese de cómo se comportará su aplicación en el futuro, por lo que si está creando instancias en Create del módulo datamodule, sería prudente (en mi humilde opinión) liberarlas en Destroy, ese es mi $ 0.02 (: – ComputerSaysNo