[Lazarus-es] error al liberar formulario

José Mejuto joshyfun en gmail.com
Sab Nov 6 13:55:37 CET 2010


Hello Paola,

Saturday, November 6, 2010, 11:52:26 AM, you wrote:

PB> muchas gracias por las aclaraciones...
>> Si tienes en TABMEquipos controles que dependen de conexiones o
>> queries o algo que está en DMPrincipal, si liberas DMPrincipal, al
>> hacer el close del formulario, estos controles (como un datagrid)
>> intentarán cerrar el SQL que está en DMPrincipal, pero oh! sorpresa,
>> DMPrincipal ya no existe!!! :) KBoom!
PB> si, el TABMEquipos tiene un rxdbgrid asociado a un tztable.
>> Con los datamodules, o los abres al principio del programa, y los
>> dejas ahí hasta que lo cierres, o bien los usas de este modo:
PB> y no alcanza con comentar el DMPrincipal.Free? o no es muy prolijo?
PB> Cuando hago un CloseAction:= caFree, qué pasa con el DMPrincipal? se
PB> ejecuta su evento onDestroy?
PB> Este método lo tengo en varios ABM, que te diría son casi idénticos,
PB> cambian las tablas... lo que todavía no entiendo es porqué esto pasa
PB> solo en algunos..

Para detectar estos problemas compila el proyecto con la opción de
heaptrc "Proyecto -> Opciones -> Enlazado -> Usar heaptrc", ya que
cada vez que liberas un bloque de memoria, heaptrc lo marca para que
si intentas usarlo después de ser liberado siempre de error. En
compilaciones normales puede dar error o no, es cuestión de azar. Si
haces un DMPrincipal.free sin usar heaptrc, simplemente se libera la
memoria, de modo que si intentas acceder de nuevo al objeto liberado
la información correcta puede seguir ahí o no, depende del azar, si
sigue ahí, pues no dará error, pero si el memory manager ya le ha
asignado ese bloque liberado a otro objeto, el contenido será basura y
kboom!. Te pongo un ejemplo:

program test1;
var
  p: Pchar;
  s: ansistring;
begin
  s:='Esto es una prueba';
  p:=pchar(s);
  s:='';
  Writeln(p);
end.

Qué se supone que debería imprimir writeln(p) ? La memoria de s ya ha
sido liberada, pero el texto sigue en el mismo sitio... Si de
casualidad otro objeto coje ese bloque de memoria, la información será
ruido.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list