Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asignar a nil despues de liberar puntero (https://www.clubdelphi.com/foros/showthread.php?t=86959)

BDWONG 28-10-2014 01:00:31

Asignar a nil despues de liberar puntero
 
Bueno estos temas creo que ya se han preguntado mucho pero aun sigo con la duda, entiendo de que despues de crear un puntero
y ya no lo necesitamos hay que liberarlo

pero mi pregunta viene, asi que siempre que hago un dispose o freemem es aconsejable asignarle el valor nil ya que si no lo hago el puntero puede ser nuevamente accedido a el y esto me preocupa

asi que lo que hago es esto:

Código Delphi [-]
  var
  p:^integer;

begin
   new(p);
   p^:=10;
   writeln('posicion en memoria es ',integer(p));

   dispose(p);
   p:=nil;//me da la impresion de que siempre tengo que ponerlo  a nil despues de hacer un dispose
   p^:=11;//esto lo puse para que el programa caiga si se intenta acceder otra vez al puntero liberado
   writeln(integer(p));

   readln;
end.

ecfisa 28-10-2014 01:33:16

Hola BDWONG.

Siempre es aconsejable asignar nulo a un apuntador para denotar que no está apuntando a nada. Si lo tomas como norma, podes verificar sin dificultad en cualquier momento si un apuntador esta asignado:
Código Delphi [-]
var
  i: Integer;
  p: ^Integer;
begin
  p:= nil;
  p:= @i;
  if Assigned(p) { p <> nil } then
    Writeln('Todo ok, p^ = ',p^)
  else
    Writeln('¡¡¡ Imposible !!!');

  p:= nil;

  if not Assigned(p) { p = nil }  then
    Writeln('Todo ok, p = nil')
  else
    Writeln('¡¡¡ Imposible !!!');

  readln;
end.

Saludos :)

BDWONG 28-10-2014 03:29:19

Gracias por responder, el codigo esta muy claro voy a seguir tu consejo.
saludos....

roman 28-10-2014 05:05:47

Cita:

Empezado por BDWONG (Mensaje 483902)
pero mi pregunta viene, asi que siempre que hago un dispose o freemem es aconsejable asignarle el valor nil ya que si no lo hago el puntero puede ser nuevamente accedido a el y esto me preocupa

Realmente depende del uso que le des al apuntador. Si la variable es susceptible de usarse en otro contexto, conviene ponerlo a nil. Pero en caso como el que ejemplifcas, una variable local a un procedimiento, es innecesario.

// Saludos


La franja horaria es GMT +2. Ahora son las 00:39:29.

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