Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-12-2005
Avatar de Coco_jac
Coco_jac Coco_jac is offline
Miembro
 
Registrado: mar 2005
Ubicación: Lima Peru
Posts: 338
Poder: 20
Coco_jac Va por buen camino
Liberar estructura

Hola amigos del foro, tengo una estructura que utilizo para almacenar ciertos datos (nombre,codigo, telefono,....), pero una vez utilizados estos datos como puedo liberar de memoria dicha estructura, ya que una vez que la utilizo es muy raro que la vuelva a utilizar.Tengo en ella como 10 campos.

Espero sus comentarios..............................
Responder Con Cita
  #2  
Antiguo 12-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Te refieres a un record??.. de ser así en lugar de crear una variable del tipo del record, te conviene crear una variable que tenga un puntero a ese record, y asignar y liberar la memoria cuando lo necesites.

Código Delphi [-]
type
  TMiRecord = record
    Value1: Integer;
    Value2: Integer;
  end;
  PMiRecord = ^TMiRecord;
...
var
  P: PMiRecord;
...
  { Asigna la memoria }
  GetMem(P, SizeOf(TMiRecord));
  ...
  { Usa el registro }
  P^.Value1 := 1;
  ...
  { Lo libera }
  FreeMem(P);

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 12-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sólamente añadir que al usar punteros a registros me parece que hay que tener especial cuidado con campos tipo string. Normalmente uno no debe preocuparse por el manejo de strings pero en este caso, antes de liberar la memoria del registro debe ponerse explícitamente a nil cualquier campo tipo string ya que, de lo contrario, Delphi no sabrá en qué momento liberar la memoria que asignó al string.

// Saludos
Responder Con Cita
  #4  
Antiguo 12-12-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
Sólamente añadir que al usar punteros a registros me parece que hay que tener especial cuidado con campos tipo string. Normalmente uno no debe preocuparse por el manejo de strings pero en este caso, antes de liberar la memoria del registro debe ponerse explícitamente a nil cualquier campo tipo string ya que, de lo contrario, Delphi no sabrá en qué momento liberar la memoria que asignó al string.
Yo en esos casos para garantizar un largo fijo, opté por utilizar arrays de Chars....
Coco, en el caso que utilizes en los campos del registro algun puntero, siempre te tienes que encargar de liberarlo antes de liberar la memoria del record sino perderas la dirección.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 12-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Yo en esos casos para garantizar un largo fijo, opté por utilizar arrays de Chars....
Yo hubiera pensado en un String[20] o ShortString.

Ahora, esto que mencioné recuerdo haberlo leído en algún mensaje de Peter Below, aunque buscando ahora en Tamaracka me encuentro con una respuesta de Rudy Velthuis donde dice que Dispose sobre el puntero al registro es más que suficiente. Aunque en ese caso habrá que usar New en lugar de GetMem.

// Saludos
Responder Con Cita
  #6  
Antiguo 12-12-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por Román
Ahora, esto que mencioné recuerdo haberlo leído en algún mensaje de Peter Below, aunque buscando ahora en Tamaracka me encuentro con una respuesta de Rudy Velthuis donde dice que Dispose sobre el puntero al registro es más que suficiente. Aunque en ese caso habrá que usar New en lugar de GetMem.
O sea, ¿Algo como lo siguiente funcionaría? (Desde luego compila y se ejecuta sin error aparente...) ¿Y además sería una buena forma de hacerlo?

Código Delphi [-]
type
  TRegistro = record
    unCampo: integer;
    otroCampo: string;
  end;
  PRegistro = ^TRegistro;

var
  PUnRegistro: PRegistro;

procedure TForm1.Button1Click(Sender: TObject);
begin
  New(PUnRegistro);

  PUnRegistro.unCampo := 1;
  PUnRegistro.otroCampo := 'Una cadena';

  ShowMessage(PUnRegistro.otroCampo);
  ShowMessage(IntToStr(PUnRegistro.unCampo));

  Dispose(PUnRegistro);
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 00:33:50.


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