![]() |
Dynamisches Array verkleinern
Hi
ich hab ein dynamisches Array:
Delphi-Quellcode:
Um Werte reinzuschreiben muss ich erst einmal eine Länge setzen:
var DynArray: Array of Integer;
Delphi-Quellcode:
Wenn ich das Array vergrößern will rufe ich einfach nochmal SetLength auf:
SetLength(DynArray, 20);
Delphi-Quellcode:
Ich habe bisher, um das Array wieder zu verkleinern, wieder SetLength aufgerufen, mit einem kleineren Wert.
SetLength(DynArray, 35);
Nun lese ich: Zitat:
Delphi-Quellcode:
Und nun zu meiner Frage:
DynArray := Copy(DynArray, 0, 10);
Kann ich das auch mit SetLength machen oder hab ich dann ein Speicher-Leak? Ich müsste dann nämlich alle bisherigen Projekte umschreiben^^ mfg.Dominik |
Re: Dynamisches Array verkleinern
Hallo Dominik,
du wirst das eventuell untersuchen müssen, denn Borland schreibt zum Thema dynamische Arrays etwas anderes: ... Um ein dynamisches Array abzuschneiden, übergeben Sie es an SetLength oder Copy und weisen das Ergebnis wieder der Array-Variablen zu. Die Prozedur SetLength ist normalerweise schneller. ... Vergrößern geht nur mit SetLength(), verkleinern auch mit Copy() und automatischer Freigabe des Originals. Grüße vom marabu |
Re: Dynamisches Array verkleinern
Ist mir auch.
Intern wird Reallocmem aufgerufen und damit dürften keine Speicherprobleme auftreten. Auch ein Blick ins CPU-Fenster bei einem Test zeigt, dass der Memorymanager eingreift und das Array kürzt. |
Re: Dynamisches Array verkleinern
Hallo Dominik,
ich verwende in meinen Programmen immer (und ohne Probleme)...
Delphi-Quellcode:
zum vergrößern, und
SetLength(MyArray,High(MyArray)+2)
Delphi-Quellcode:
zum verkleinern.
SetLength(MyArray,High(MyArray)
Aber nun auch von mir eine Frage, die meine Unkenntnis der tieferen Vorgänge in Delphi offenbart: Ist es notwendig am Programmende das dynamische Array mit
Delphi-Quellcode:
wieder zu dereferenzieren - oder ist das völlig überflüssig, da das Programm mit seiner Beendigung (automatisch) alles aus dem Speicher entfernt?
MyArray:=nil
Gruß |
Re: Dynamisches Array verkleinern
Ok, Danke für eure Antworten :cheers:
Dann ist SetLength ja sogar besser als Copy... Da kommt mir so manches ein bisschen komisch vor was in diesem Buch steht^^ Zitat:
Und wenn du den Speicher zur Laufzeit freigeben willst einfach (wie wir grad gelernt haben^^) Setlength(MyArray, 0); aufrufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz