Außerdem hilft der GC auch nicht wirklich Bugs zu vermeiden, sondert verschleiert eher die Probleme.mschnell hat geschrieben:Genau.
Und FPC macht solche Sachen mit Absicht nicht, um hochperformante Applikationen zu ermöglichen.
-Michael
Objekte haben oft einen Lebenszyklus, wobei nach dem Tod des Objekts jeder Versuch darauf zuzugreifen ein Bug ist.
Ohne GC sieht das so aus:
a) Man bekommt eine Access-Violation, oder greift auf eventuell grob unsinnigen Datenmüll zu...
Mit sowas wie FastMM kriegt man im Debug-Modus solcher Fehler samt Ursache praktisch auf dem Tablett geliefert.
Ein guter Speichermanager kann im Debug-Modus die Objekte beim Vernichten komplett Nullen oder mit Jumps zu aussagekräftigen Expeptions überschreiben, o.Ä...
-> Sehr leicht erkennbare Bugs, deren Ursache sich fast vollautomatisch ermitteln läßt.
Mit GC:
b) Das Zombie-Objekt wird durch jede beliebige Referenz am Leben gehalten. Methodenaufrufe des Objekts sehen komplett legal aus.
-> Sehr schwer erkennbare Bugs
Um mal ein Beispiel zu geben:
Objekt A ist eine Bestellung von 20 Tonnen nassem Zement, die direkt vor deine Garage gekippt werden.
Ohne GC:
1) User klickt auf "Bestellung Sofort LÖSCHEN"
2) Objekt wird freigegeben.
3) Irgendein dummer BackgroundThread versendet die Bestellung.
4 ) Jetzt gibt es folgende Möglichkeiten:
a) das Programm crasht
b) es werden 7 "Grügel" nach Dunzenhausen bestellt.
c) (ohne Debug-Modus) das Objekt liegt noch unberührt auf derselben Speicherstelle und wird bestellt.
5) Alle wundern sich
Mit GC:
1) Die Bestellung wird gelöscht.
2) Der BackgroundThread versendet die Bestellung trotzdem
3) Der Beton wird direkt vor deine Garage gekippt
4) "War doch so ausgemacht!"
Kommt jetzt auf die Sichtweise an. Manche Leute werden sicher sagen, dass durch das Verschleiern der Bugs die Code-Qualität zunimmt (schwer reproduzierbar -> blame the User -> keine Probleme)
Fazit: ObjektPascal ist dem Schweinekram von C++, Java etc. so haushoch überlegen, dass es schon unwürdig ist darüber zu diskutieren...