Weil das dynamische Array x in diesem Beispiel direkt deklariert ist, braucht man das nicht extra mit finalize freizugeben. Am Ende der Funktion wird automatisch DynArrayClear aufgerufen.
Und genau damit schleichen sich die Fehler, die später schwer zu finden sind. Irgendwann aus irgendeinem Grund gibt der Compiler in irgendeiner zukünftigen Version am Ende der Funktion doch mal was nicht frei und dann geht die Sucherei los. Deswegen kleine Faustregel: was man manuell an Speicher reserviert und anlegt, sollte auch manuell wieder freigegeben werden!!! Ist zwar etwas Tipp-Aufwendiger, jedoch ist man dann auf der Sicheren Seite!
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Ich oute mich jetzt mal:
Ich verwende (außer bei AnsiString, von dem ich aber tatsächlich erwarte dass Delphi ihn korrekt verwaltet - was bei älteren Versionen aber durchaus nicht ganz unproblematisch war) überhaupt keine dynamischen Arrays, sondern lege meine dynamischen Daten immer als Zeiger (meist auf ein Array eines bestimmten Typs) an, dessen Speicher ich selbst mittels GetMem und FreeMem alloziere und dealloziere.
Ein Garbage Kollektor wie in C# oder VB.NET ist auch nett - allerdings glauben nun viele Leute nun keine Rücksicht mehr auf Freigaben machen zu müssen, weil eh alles verwaltet wird - ein schlampiger Programmierer kann aber immer noch empfindlich stören, wenn er z.B. eine Referenzvariable mit globalem Gültigkeitsbereich auf Daten verweisen lässt, die eigentlich nicht mehr benötigt werden: der Garbage Collector kann Speicher auch nur dann freigeben, wenn die letzte Referenz verschwunden ist - somit hat man schon das schönste Speicherloch produziert.
Mit dem Garbage Collector kann ich mich auch nicht anfreunden, weil ich eigentlich schon wissen möchte, wann Objekte wieder entfernt werden. Außerdem leidet die Disziplin darunter und man braucht gar nicht mehr nachdenken, was mit den Referenzen eigentlich passiert. Das sollte zu einem schlechteren Programmierstil führen und man kann abstruse Objektgeflechte erstellen. Bei Strings und dynamischen Arrays sehe ich das nicht so eng, weil da keine weiteren Daten dranhängen, die automatisch mit freigegeben werden, und man die Lebenszeit ungefähr einschätzen kann. Bei dynamischen Arrays ist die automatische Referenzzählung angenehm gelöst. Trotzdem kann man die nicht richtig dynamisch einsetzen, daß setlength recht langsam ist. In Delphi 6 ist mir bei den Strings auch schon mal ein Fehler im Zusammenhang mit const Parametern aufgefallen.
Initialize ist nur dafür da, daß das Array am Anfang auch leer bzw. nil ist.
Hm. Aber als ich in meinem Programm geschrieben habe : dynArray := nil; ist der Fehler auch aufgetreten, obwohl das ja auch nur eine nil zuweisung ist. Oder versucht Delphi dann den Speicher, auf den das Array vorher gezeigt hat, sofort wieder zu löschen (was dann natürlich in einem Fehler enden würde)?
Ja, genaus so ist es. Für Zuweisungen gibt es eine spezielle Funktion (DynArrayAsg) die intern dann aufgerufen wird. Am besten nimmt man bei solchen Datentypen einfach new und dispose und man braucht sich nicht mehr um solche Dinge zu kümmern.
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.