| Autor |
Beitrag |
Bleagle
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 11.05.11 15:03
Moderiert von Narses: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.05.11 15:58
|
|
Bleagle 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 19335
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|
|