PDA

Ver la Versión Completa : Liberar estructura


Coco_jac
12-12-2005, 20:08:57
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.


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



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?


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;