Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 08-02-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por geolife Ver Mensaje
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 [-]
// Metodo 2

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"...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 08-02-2018 a las 16:00:41.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Día mundial por la liberación de la cannabis. poliburro La Taberna 60 24-10-2024 14:17:55
Liberación de versiones de Delphi Neftali [Germán.Estévez] La Taberna 1 06-10-2016 10:35:13
Liberación de memoria de Tbitmap Marck Silencer Gráficos 11 27-01-2011 08:29:06
Liberación de un Form No Modal vejerf OOP 1 06-09-2010 19:41:20
Liberación de memoria Jome OOP 5 22-02-2007 14:44:56


La franja horaria es GMT +2. Ahora son las 15:53:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi