Ich hatte diesen bösen Bug, der in der Vergangenheit verschwand, aber jetzt nach einiger Zeit kehrte es zurück.FastMM4 sagt "Der Block Header wurde beschädigt"
Ich habe zwei TSam-Objekte (abgeleitet von TPersistent) erstellt und geladen in ein TAsmJob-Objekt (abgeleitet von TObjectList).
Zur Laufzeit erstellt ein Formular eine TStringGrid und dann die AsmJob, die diese beiden SAM-Objekte erstellt (und laden Sie einige Daten von der Festplatte in jedem von ihnen). Der AsmJob wird ebenfalls dem Raster zugewiesen. Wenn das Formular gelöscht wird, kümmert sich das Grid um den AsmJob, indem er ihn freigibt, wodurch die TSam-Objekte freigegeben werden. Hier ist das Problem: Das erste Objekt wird freigegeben, ohne Probleme, aber das zweite Objekt stirbt, wenn seine geerbte Methode (in Destroy Destruktor) aufgerufen wird.
Ich verwende FreeAndNil im gesamten Programm, um die Objekte zu befreien. Die TSam-Objekte sind nicht NIL !!!!! Also, das ist der erste Versuch, die Objekte zu befreien. Sogar die Daten innerhalb der Objekte sind konsistent.
Das Rückgrat des Programms sieht wie folgt aus:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Ich verstehe wirklich nicht, wo ich versuchen, das Objekt zu verdoppeln frei oder überschreiben, nachdem es freigegeben wurde.
edit:
Einige der Fehler, die ich habe:
FastMM einen Fehler während eines freien Block Scan-Operation erkannt hat. FastMM hat festgestellt, dass ein Block geändert wurde, nachdem er freigegeben wurde.
FastMM hat während eines freien Block-Scan-Vorgangs einen Fehler festgestellt. Der Block Header wurde beschädigt.
Detail:
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]
Ich habe alle "debug" Optionen in der IDE aktiviert, einschließlich der "Range Check". Außerdem ist das FastMM4 auf einen extrem aggressiven Debug-Modus eingestellt. Ohne FastMM oder außerhalb des Debuggers läuft das Programm gut - aber ich weiß, dass es nicht bedeutet, dass der Bug nicht mehr da ist. Tatsächlich hat es (wahrscheinlich) für mehr als ein Jahr funktioniert, bis ich FastMM installiert habe.
edit:
Danke an alle. Nein, ich fühle, dass ich mich ein bisschen in die gute Richtung bewege.
Die Struktur des Programms ist komplizierter Ich bot nur das Rückgrat, um den ursprünglichen Beitrag klein zu halten. Aber was zum Teufel, es wurde schon größer :) Also diese TSam Objekte werden verwendet, um Daten von der Festplatte zu laden. Eine Datei in jedem Objekt. Sie machen auch etwas Verarbeitung und Datenvalidierung. Für jede dieser TSam habe ich auch ein graphisches Objekt, das auf dem Bildschirm (grafisch) die Daten anzeigt, die in den TSam-Objekten enthalten sind. Jede Zeile im TStringGrid zeigt auch die Daten in TSam, aber im Text.
Eine Frage, die ich habe: Wenn ich das Programm in kleineren Stücken brechen, um herauszufinden, wo der Fehler ist, wird der Fehler immer noch angezeigt? Oder ist es möglich, nur in dieser bestimmten Konfiguration zu erscheinen?
Antwort zu „Wie funktioniert die AsmJob zu TStringGrid zugewiesen bekommen, so dass die TStringGrid die AsmJob zerstört, können Sie uns zeigen?“
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
dann irgendwo in der TForm.Create (die Form, die das Gitter hält), kann ich
MyGrid.AsmJob=AsmJob;
und im Destruktor des MyGrid ich tun:
begin
FreeAndNil(AsmJob);
inherited
end;
Danke Alexander. Ich hatte keine Ahnung von "ScanMemoryPoolForCorruptions". Ich denke, eine Funktion wird von der FastMM DLL angeboten. Ich werde jetzt gleich danach suchen. – Ampere
Das ist die Funktion von Standard FastMM4.pas. Es ist von der vollständigen eigenständigen Version von FastMM. Es ist nicht in der FastMM-Version vorhanden, die in Delphi integriert ist. Hier ist keine DLL in Frage. Dies ist nur eine Funktion in üblichen Pas-Datei;) – Alex
Leider ist die Verbindung tot. Aber Sie können darauf zugreifen: http://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198 – EMBarbosa