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 28-10-2014
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 28-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 28-10-2014
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 11
BDWONG Va por buen camino
Gracias por responder, el codigo esta muy claro voy a seguir tu consejo.
saludos....
Responder Con Cita
  #4  
Antiguo 28-10-2014
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 BDWONG Ver Mensaje
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
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con asignar valor nil a un puntero kdemia Varios 11 24-11-2011 03:30:05
Asignar ID despues de insert vicacos Conexión con bases de datos 3 04-06-2008 14:07:26
¿liberar memoria despues de usar una Query? mrmanuel Conexión con bases de datos 25 01-11-2006 14:20:14
liberar la impresora despues de imprimir JODELSA Impresión 3 15-04-2004 15:43:44
¿Por qué CommitRetaining funciona después de agregar, pero no después de modificar? Al González Firebird e Interbase 7 16-02-2004 23:47:28


La franja horaria es GMT +2. Ahora son las 18:06:34.


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