Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit doppelter Objektfreigabe
Bleagle - Mi 11.05.11 15:03
Titel: Problem mit doppelter Objektfreigabe
Moderiert von
Narses: Abgetrennt von [url=http://www.delphi-forum.de/viewtopic.php?t=105444]hier[/url]
Ich hätte ein neues Problem, mit dem selben programm, das lässt sich aber auch schnell lösen.
es klappt soweit, allerdings gibt es probleme bei der freigabe eines objektes. Ein objekt ist schon freigegeben und wird dann wieder freigegeben. eigentlich soll free das ja von selbst erkennen.. wenn ich zur stelle im debugger komme wird das cpu fenster geöffnet und später ein accessviolation error ausgegeben. Wenn ich @image überwache, erhalte ich auch eine adresse, aber sollte die nicht eigentlich ins leere zeigen?
startet die .exe und drückt auf play, danach auf stop, danach wieder auf play.
Nersgatt - Mi 11.05.11 15:28
Ohne jetzt den Anhang angeschaut zu haben: Free prüft, ob das Objekt nil ist. Wenn Du ein Objekt freigibst (oder noch nicht erzeugt hast), heißt das aber nicht zwingend, dass es auch nil ist. Daher in so einem Fall im Zweifel lieber FreeAndNil verwenden.
Jens
Bleagle - Mi 11.05.11 15:57
Hmm, tatsache, mit freeandnil klappts.
Also wenn ein objekt befreit wird, wird der speicher, der diesem objekt zugeordnet ist, freigebeben? Aber auf was soll der pointer dann sonst zeigen, als auf nil?
jaenicke - Mi 11.05.11 15:58
Bleagle hat folgendes geschrieben : |
Hmm, tatsache, mit freeandnil klappts.
Also wenn ein objekt befreit wird, wird der speicher, der diesem objekt zugeordnet ist, freigebeben? Aber auf was soll der pointer dann sonst zeigen, als auf nil? |
Auf die Stelle, an der das Objekt lag. Wenn du den Zeiger auf das Objekt nicht änderst, zeigt der eben weiter auf die Speicherstelle. ;-)
Bleagle - Mi 11.05.11 16:05
wenn der pointer weiter draufzeigt, woher weiß das system dann, dass der eigentlich nichts mehr damit zu tun hat?
ich dachte das system überprüft ob ein verweis auf den speicher vorliegt, bevor es irgendwas überschreibt..
jaenicke - Mi 11.05.11 16:19
Bleagle hat folgendes geschrieben : |
| ich dachte das system überprüft ob ein verweis auf den speicher vorliegt, bevor es irgendwas überschreibt.. |
Nein, es prüft, ob der Speicher als verwendet markiert ist. Und das ist er nicht mehr, wenn du Free aufgerufen hast.
delfiphan - Mi 11.05.11 21:22
jaenicke hat folgendes geschrieben : |
| Nein, es prüft, ob der Speicher als verwendet markiert ist. Und das ist er nicht mehr, wenn du Free aufgerufen hast. |
Beim Aufruf einer Methode oder Property wird überhaupt nichts geprüft. Der Pointer kann nil sein oder irgendwo ins Nirwana zeigen, du kannst trotzdem einen Methodenaufruf machen - solange die Methode selbst nicht auf Speicher zugreift meckert er nicht.
Free gibt den Speicher nicht unbedingt frei. Der Memory Manager committed Speicher in Blöcken.
Du solltest überhaupt keine Annahmen über die Speicherstelle machen, wo das Objekt lag, weder, dass die Speicherstelle frei ist, darauf zugegriffen werden kann, noch sonst was.
Wenn du auf einer wohldefinierten Umgebung coden willst, dann ist wahrscheinlich .NET eher was für dich.
jaenicke - Mi 11.05.11 22:58
delfiphan hat folgendes geschrieben : |
| Beim Aufruf einer Methode oder Property wird überhaupt nichts geprüft. |
Nein, aber bei der Erstellung eines neuen Objekts. So hatte ich die Frage verstanden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!