Cita:
Empezado por geolife
En el método 1, al ser una variable local de un procedimiento ¿Se liberarían los recursos si hubiese alguna excepción después de la asignación?, ¿o debemos forzar con el segundo método siempre?
|
Pues en este caso ninguno de los 2 métodos te liberra correctamente. Porque fíjate que en el METODO 1 creas 1 (en el procedimiento DelimitarString) y no liberas ninguno y en el METODO 2 creas 2 y sólo liberas 1.
Además Delphi te provee un método para revisar esto:
En el DPR añade la siguiente línea:
Código Delphi
[-]
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
Application.Initialize;
...
Al ejecutar tu programa con estos 2 método al acabar saldrá una ventana como estas:
En ambos casos ves que estás perdiendo memoria.
Una solución correcta (para no perder memoria) aunque en mi opinión tampoco correcta del todo, sería esta:
Código Delphi
[-]
Var
St: TStringList;
begin
St := DelimitarString('Uno;Dos;Tres', ';'); <-- Aquí dentro la creas
Showmessage(St[0] + #13 + St[1] + #13 + St[2]);
FreeAndNil(St); <-- Aquí lo liberas
En este último caso no aparece la venana de pérdida de memoria, aunque comento que NO es correcta en mi opninión, porque yo tengo una máxima: "Quien crea un opbjeto es el encargado de liberarlo"
Así que siguiendo esas indicaciones un código correcto para mi, sería este:
Código Delphi
[-]
Function TForm2.DelimitarString(Cadena: String; Delimitador: Char; var TS:TStringList): TStringList;
begin
TS.Delimiter := Delimitador;
TS.StrictDelimiter := True;
TS.DelimitedText := Cadena;
end;
procedure TForm2.Button2Click(Sender: TObject);
Var
St: TStringList;
begin
St := TStringList.Create;
Try
DelimitarString('Uno;Dos;Tres', ';', St);
Showmessage(St[0] + #13 + St[1] + #13 + St[2]);
Finally
St.Free;
end;
end;
Hay otras si sigues el mismo "precepto"...