Tuve este desagradable error que desapareció en el pasado, pero ahora después de bastante tiempo regresó.FastMM4 dice "El encabezado del bloque se ha dañado"
Tengo dos objetos TSam (derivados de TPersistent) creados y cargados en un objeto TAsmJob (derivado de TObjectList).
En tiempo de ejecución, un formulario crea un TStringGrid y luego el AsmJob que crea esos dos objetos SAM (y carga algunos datos del disco en cada uno de ellos). AsmJob también se asigna a la grilla. Cuando se destruye el formulario, The Grid se encarga de AsmJob liberándolo, lo que libera los objetos TSam. Aquí está el problema: el primer objeto se libera sin problemas, pero el segundo muere cuando se llama su método heredado (en Destroy destructor).
Utilizo FreeAndNil en todo el programa para liberar los objetos. Los objetos TSam no son NILOS !!!!! Entonces, este es el primer intento de liberar los objetos. Incluso los datos dentro de los objetos son consistentes.
La columna vertebral del programa tiene el siguiente aspecto:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Realmente no entiendo donde intento hacer doble libre o sobrescribir el objeto después de que ha sido puesto en libertad.
edición:
Algunos de los errores que tengo:
FastMM ha detectado un error durante una operación de exploración bloque libre. FastMM detectó que un bloque ha sido modificado después de ser liberado.
FastMM ha detectado un error durante una operación de exploración de bloque gratuita . El encabezado del bloque se ha dañado.
Detalle:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
tengo todas las opciones "depuración" habilitadas en el IDE, incluyendo el "rango de control". Además, el FastMM4 está configurado en modo de depuración súper agresivo. Sin FastMM o fuera del depurador, el programa funciona perfectamente, pero aún así sé que no significa que el error ya no esté allí. En realidad funcionó (probablemente) durante más de un año, hasta que instalé FastMM.
edición:
Gracias a todo el mundo. No, estoy sintiendo que me estoy moviendo un poco en la buena dirección.
La estructura del programa es más complicada Ofrecí solo la columna vertebral para mantener la publicación original pequeña. Pero qué diablos, ya se hizo más grande :) Entonces, esos objetos TSam se usan para cargar datos del disco. Un archivo en cada objeto. También están haciendo algo de procesamiento y validación de datos. Para cada uno de estos TSam también tengo un objeto gráfico que muestra en la pantalla (gráficamente) los datos contenidos en los objetos TSam. Cada línea en el TStringGrid también muestra los datos en TSam, pero textualmente.
Una pregunta que tengo: si rompo el programa en trozos más pequeños para descubrir dónde está el error, ¿seguirá apareciendo el error? ¿O es posible aparecer solo en esta configuración particular?
respuesta a "¿cómo el AsmJob se asignan a TStringGrid para que el TStringGrid destruye la AsmJob, nos muestras?"
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
continuación, en algún lugar del TForm.Create (la forma que tiene el Grid), yo
MyGrid.AsmJob=AsmJob;
y en el destructor de la MyGrid yo:
begin
FreeAndNil(AsmJob);
inherited
end;
Gracias Alexander. No tenía ni idea sobre "ScanMemoryPoolForCorruptions". Supongo que es una función que ofrece FastMM DLL. Iré a buscar sobre esto ahora mismo. – Ampere
Esa es la función de FastMM4.pas estándar. Es de la versión completa independiente de FastMM. No existe en la versión de FastMM, que está integrada en Delphi. No hay una DLL en cuestión aquí. Esta es solo una función en el archivo pas habitual;) – Alex
Lamentablemente, el enlace está muerto. Pero puede acceder a él en: http://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198 – EMBarbosa