Autor Beitrag
Bleagle
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 11.05.11 15:03 
Moderiert von user profile iconNarses: Abgetrennt von [url=www.delphi-forum.de/...?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.
Einloggen, um Attachments anzusehen!
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: Bleagle
Bleagle Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.05.11 15:58 
user profile iconBleagle hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.05.11 16:19 
user profile iconBleagle hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.05.11 21:22 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.05.11 22:58 
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
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.