FastMM und block modified after being freed
Hallo Leute,
ich hab ein kleines Problem mit FastMM. Beim Beenden der Applikation kommt die Fehlermledung "FastMM detected that a block has been modified after being freed". Ich bau mir in meiner Applikation einen Baum aus einzelnen Knoten auf. Diese Knoten können von mehreren verschiedenen Typen sein, die alle von einer Basisklasse "A" abgeleitet sind (die wiederum von TObject abgeleitet ist). Wenn die Applikation nun geschlossen wird, wird der Baum rekursiv gelöscht. Sofern nur der RootNode vorhanden ist, gibt's auch keinen "Fehlermeldung" von FastMM. Sobald jedoch ChildNodes vorhanden sind, gibt's eben die Meldung. Da ich auch nach mehreren Stunden Codeanalyse nicht auf einen ev. Fehler gekommen bin, nun meine Frage ob hier nicht eventuell durch die Rekursion FastMM auf den Holzweg geleitet wird, da ja Rekursionen den Stack auch beeinflussen. :gruebel: Hat jemand Erfahrung damit? Das Löschen auch großer Strukturen funktioniert ohne Exceptions, d.h. ablauftechnisch ist der Source soweit i.O, nur eben die Beeinflussung des Stacks nicht.... Bin für jeden Hinweis dankbar! |
Re: FastMM und block modified after being freed
Das bedeutet, (a) daß du die Fehlerprüfung von FastMM aktiviert hast :-D
und (b) daß irgendwo ein Speicherbereich verändert wurde, nach dem der entsprechende Speicherblock (welcher an dieser Stelle lag) schon freigegeben wurde. Quasi sowas in der Art:
Delphi-Quellcode:
FastMM gibt ja speicher nicht sofort an Windows zurück, weswegen es bei einem späteren Zugriff nicht zu einer Zugriffsverletzung kommt.
var P: PInteger;
P := GetMem(10); FreeMem(P); P^ := 100; Uhrsache könnte auch ein Bufferoverrun sein oder ein "fehlerhafter" Pointer, welcher "irgendwo" hinzeigt. In deinem Fall könnte es auch sein, daß auf ein Objekt zugegriffen wird, welches schon freigegeben wurde. (der Speicherbereich des Objektes könnte ja dennoch existieren) |
Re: FastMM und block modified after being freed
führt eine Anweisung
Delphi-Quellcode:
in diesem Fall ebenfalls zu einem "Zugriff"?
Node.NextNode.Free;
... ... Node.NextNode:=NIL; |
Re: FastMM und block modified after being freed
Nein.
Hier wird nur auf die Variable, aber nicht auf das Objekt zugegriffen. Hier wäre es ein Zugriff
Delphi-Quellcode:
Node.NextNode.Free;
Node.NextNode.irgendwas ... PS:
Delphi-Quellcode:
entspricht
Node.NextNode.Free;
Node.NextNode:=NIL;
Delphi-Quellcode:
Aber Letzteres ist kürzer und es wäre fehlerunanfälliger. (z.B. bei einer Exception innerhalb von .Free )
FreeAndNil(Node.NextNode);
|
Re: FastMM und block modified after being freed
Hab Problem gefunden, war ein "verlorener Zeiger" ganz wo anders im Programm.
Danke für die Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz