dynamische Arrays

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
monta
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

Beitrag von monta »

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?
Johannes

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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.

monta
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:

Beitrag von monta »

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.
Johannes

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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.
Ja, ein Array ist ja doof und keine Klasse.
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;

Christian
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:

Beitrag von Christian »

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.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
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:

Beitrag von monta »

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.
Johannes

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

monta hat geschrieben:GC?
http://de.wikipedia.org/wiki/Automatisc ... ereinigung" onclick="window.open(this.href);return false;
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.
Klar, war auch nicht als Vorschlag gemeint. Wollte nur erwähnen, dass es die Möglichkeit gäbe.

Antworten