Hi und danke erstmal! Jetzt weiß ich zumindest, dass der Fehler nicht direkt an mir lag

.
Aber so ganz hab ich das noch nicht verstanden. SetLength verändert doch eigentlich nur die Größe des Arrays, und das Array besteht nur aus ein paar 32Bit-Werten. Davon, dass die Größe des Arrays verändert wird, sollten doch die Records gar nicht betroffen sein, oder? Lässt man nämlich das New(PSomeData) (und was da so zugehört) weg, gibt es keine Speicherprobleme mehr. Also was haben die Records da noch mit zu tun?
Kann es vielleicht sein, dass Delphi erst dem Array einen Platz zuweist, und dann den Records, die direkt danach erzeugt werden, den Platz direkt hinter dem Array erhalten? Also das erste Record wäre bei der Adresse "PSomeData(LongInt(@TheData)+4*(High(TheData)+1))"? Und dann soll irgendwann das Array vergrößert werden und plötzlich sind da ganz viele Records im Weg (nämlich genau GrowSize Stück)? Also wird der Speicher des Arrays freigegeben (aber so, dass dieser Speicher trotzdem nicht irgendwann mit neuen Records gefüllt wird) und das Array neu hinter dem jetzt letzten Record erzeugt ("LongInt(TheData[High(TheData)])+SizeOf(TSomeData)").
Ich weiß nicht, ob das alles so stimmt, aber für mich würde es Sinn machen. Es macht für mich dann bloß keinen Sinn, dass der freigewordene Platz nicht mit den nächsten Records gefüllt wird. Aber jedenfalls passt die "Theorie" zu dem Verhalten (bei größerer GrowSize muss das Record nicht so oft verschoben werden, also weniger Speicherverschwendung durch Fragmentierung).
Sagt mir mal einer, ob ich damit richtig liege und wenn ja, warum nicht (ok, der ist alt

)? Würde schon gerne mal etwas mehr davon verstehen.
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.