Ich hab mal nen paar Fragen zu dynamischen Array.
Als erstes mal zu Setlenght, Setlenght setzt ja entsprechend die Länge, wie verhält sich dies aber bei einem Array of TObject, wenn ich die Länge herabsetze und somit Elemente herausfallen.
Werden die Objekte automatisch gelöscht und freigegeben oder sollte dies manuell vorher erfolgen? Bzw. ist überhaupt sich, das die Elemente 'weg' sind, oder kann es passieren, das ein erneutes Setlenght wieder noch im Speicher befindliche Elemente zum Vorschein bringt?
Gibt es, außer über ne for-Schleife und das aufrufen aller Felder des Array auch nen schnelleren Weg, zwei dynamische Arrays identischen Types zu einem zusammen zu fassen?
dynamische Arrays
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
dynamische Arrays
Johannes
Nimm doch TObjectList, da ist alles pfannenfertig. (unit contnrs)
Wenn OwnsObjects True ist, werden die Objekte von der Liste selber gelöscht.
Mit AddList kannst du zwei Listen zusammenfassen.
Wenn's dich beruhigt: dahinter steckt auch ein Array.
Warum denn das Rad immer neu erfinden? Ist doch alles optimal performant gelöst und gut getestet.
Wenn OwnsObjects True ist, werden die Objekte von der Liste selber gelöscht.
Mit AddList kannst du zwei Listen zusammenfassen.
Wenn's dich beruhigt: dahinter steckt auch ein Array.

Warum denn das Rad immer neu erfinden? Ist doch alles optimal performant gelöst und gut getestet.
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
Ich wollte gar nichts neu erfinden, und es ging nicht um die Sache mit dem Stringgrid, da ist dein Code bestens nach der registrierungbei dir übernehmen
.
Sondern ich hab ein bestehendes Projekt, was halt folkommen auf dyn-Arrays basiert und das wollte ich ungern alles sofort umstellen müssen.
Und da war ich jetzt halt in der Situation, zwei Array zusammenfügen zu müssen, da die von unterschiedlichen Funktionen stammen aber im Endeffekt als ganzes verarbeitet werden, daher auch die Frage nach dem Zusammenfügen.
Aus deiner Antwort deut ich mal...theoretisch muss man die Objekte also freigeben, bevor man das Array kürzt, sonst gibts nen Speicherloch.

Sondern ich hab ein bestehendes Projekt, was halt folkommen auf dyn-Arrays basiert und das wollte ich ungern alles sofort umstellen müssen.
Und da war ich jetzt halt in der Situation, zwei Array zusammenfügen zu müssen, da die von unterschiedlichen Funktionen stammen aber im Endeffekt als ganzes verarbeitet werden, daher auch die Frage nach dem Zusammenfügen.
Aus deiner Antwort deut ich mal...theoretisch muss man die Objekte also freigeben, bevor man das Array kürzt, sonst gibts nen Speicherloch.
Johannes
Ja, ein Array ist ja doof und keine Klasse.monta hat geschrieben: Aus deiner Antwort deut ich mal...theoretisch muss man die Objekte also freigeben, bevor man das Array kürzt, sonst gibts nen Speicherloch.
Es gäbe theoretisch eine Möglichkeit, das trotzdem automatisch zu machen: Interfaces.
Diese sind referenzgezählt und werden freigegeben, sobald sie nirgends mehr gebraucht werden.
Das ist eine art GC für arme.

http://www.dummzeuch.de/delphi/object_p ... utsch.html" onclick="window.open(this.href);return false;
http://www.dummzeuch.de/delphi/object_p ... utsch.html" onclick="window.open(this.href);return false;
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
1. Setlength gibt nur den restlichen Speicher frei da ja nur Zeiger auf deine Objekte gespeichert werden werden diese natürlich nicht angerührt und du hast hinterher sofern nicht woanders referenziert auch keine Chance ranzukommen.
2. Es kann duchaus sein das wenn du die Länge wiederherstellst das du auf ein paar der Objekte wieder zugreifen kannst sofern der Speicherbereich nicht anderweitig genutzt wurde ist aber äusserst unwarscheinlich.
2. Es kann duchaus sein das wenn du die Länge wiederherstellst das du auf ein paar der Objekte wieder zugreifen kannst sofern der Speicherbereich nicht anderweitig genutzt wurde ist aber äusserst unwarscheinlich.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
GC?
Eh ich interfaces einbau, kann ich wohl auch auf TList umstellen und das dürfte noch wesentlich sauberer und komfortabler sein, wenn ich die Links so anseh.
Und ansonsten also imer ein Free der Objekte...gut zu wissen, hab ich irgendwie bisher komplett vergessen. Ansonsten könnte ja auch unter der ganz seltenen Konstellation das 2. zutrifft, das Programm etwas unschön arbeiten und Fehler produzieren, weils vielleicht noch mit ner alten angabe arbeitet.
Eh ich interfaces einbau, kann ich wohl auch auf TList umstellen und das dürfte noch wesentlich sauberer und komfortabler sein, wenn ich die Links so anseh.
Und ansonsten also imer ein Free der Objekte...gut zu wissen, hab ich irgendwie bisher komplett vergessen. Ansonsten könnte ja auch unter der ganz seltenen Konstellation das 2. zutrifft, das Programm etwas unschön arbeiten und Fehler produzieren, weils vielleicht noch mit ner alten angabe arbeitet.
Johannes
http://de.wikipedia.org/wiki/Automatisc ... ereinigung" onclick="window.open(this.href);return false;monta hat geschrieben:GC?
Klar, war auch nicht als Vorschlag gemeint. Wollte nur erwähnen, dass es die Möglichkeit gäbe.monta hat geschrieben: Eh ich interfaces einbau, kann ich wohl auch auf TList umstellen und das dürfte noch wesentlich sauberer und komfortabler sein, wenn ich die Links so anseh.