[Lazarus-es] Error al cerrar mi aplicacion

José Mejuto joshyfun en gmail.com
Vie Dic 10 00:43:01 CET 2010


Hello Juan,

Thursday, December 9, 2010, 9:29:59 PM, you wrote:

JMP>  Hola. 
JMP>  Curiosamente se ha solucionado al desactivar la opción "heaptrc" del menú
JMP> "Enlazado".
JMP>  Sería interesante saber si a vosotros os da el mismo error si activáis esta
JMP> opción. Supongo que no, que se debe a que tengo que liberar unos cuantos bytes
JMP> de la pila, y por ser un novato con el freepascal no sé cómo hacerlo.
JMP>  Muchas gracias José :-)

Si desactivas la opción y ya no da el error, entonces es seguro que
tienes un puntero loco. El heaptrc una de las cosas que hace es que
cuando liberas un bloque de memoria este asigna un valor de marcado,
de modo que si intentas usar el bloque después de liberarlo dará un
error con seguridad, cosa en en otro caso es incierta.

Imagina este programa:

----------------------------------------------------
program pruebamemoria;

uses classes;

var
  p: pchar;
begin
  getmem(p,256); //reservamos 256 bytes de memoria
  Fillchar(p,64,'A');
  p[64]:=#0;
  writeln(p);
  freemem(p);
  inc(p,8);
  writeln(p);
  readln();
end.
-----------------------------------------------------

Ejecuta ese programa con y sin heaptrc y verás el problema, y como el
puntero loco es "p" ya que se usa después de liberarlo.

Una buena técnica es que en vez de "Objeto.free" uses
"FreeAndNil(Objeto)" y en los punteros en vez de "freemem(x)" uses
"freemem(x);x:=nil;"

-- 
Best regards,
 José





More information about the Lazarus-es mailing list