Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   FastMM und block modified after being freed (https://www.delphipraxis.net/150791-fastmm-und-block-modified-after-being-freed.html)

SBDelphi 27. Apr 2010 10:46


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!

himitsu 27. Apr 2010 10:57

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:
var P: PInteger;

P := GetMem(10);
FreeMem(P);
P^ := 100;
FastMM gibt ja speicher nicht sofort an Windows zurück, weswegen es bei einem späteren Zugriff nicht zu einer Zugriffsverletzung kommt.

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)

SBDelphi 27. Apr 2010 12:10

Re: FastMM und block modified after being freed
 
führt eine Anweisung
Delphi-Quellcode:
Node.NextNode.Free;

...
...

Node.NextNode:=NIL;
in diesem Fall ebenfalls zu einem "Zugriff"?

himitsu 27. Apr 2010 12:16

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:
Node.NextNode.Free;
Node.NextNode:=NIL;
entspricht
Delphi-Quellcode:
FreeAndNil(Node.NextNode);
Aber Letzteres ist kürzer und es wäre fehlerunanfälliger. (z.B. bei einer Exception innerhalb von .Free )

SBDelphi 3. Mai 2010 11:39

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