Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Liberar estructura (https://www.clubdelphi.com/foros/showthread.php?t=28185)

Coco_jac 12-12-2005 20:08:57

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..............................

delphi.com.ar 12-12-2005 20:53:23

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!

roman 12-12-2005 21:04:26

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

delphi.com.ar 12-12-2005 21:12:57

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.... :D
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.

roman 12-12-2005 21:18:59

Cita:

Empezado por delphi.com.ar
Yo en esos casos para garantizar un largo fijo, opté por utilizar arrays de Chars.... :D

Yo hubiera pensado en un String[20] o ShortString. :p

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

dec 12-12-2005 21:42:11

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;


La franja horaria es GMT +2. Ahora son las 19:05:45.

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