![]() |
AW: BoolToStr wirft Access Violation
Zitat:
ShortString und statische Char-Arrays gehn. Genauso wie es bei Interfaces, Variants und dynamischen Arrays auch nicht geht, bzw. nicht ohne Beachteung gewisser Dinge, bei deren automatischen Speicherwerwaltung. In der Unit System gibt es eine Abteilung "Compiler helper for initializing/finalizing variable" mit netten Funktionen. New Dispose Initialize InitializeArray InitializeRecord Finalize FinalizeArray FinalizeRecord CopyArray CopyRecord Welche Delphi intern verwendet und die man notfalls selber verwenden könnte, aber dennoch sollte man ein bissl Ahnung davon haben, wie z.B. die Speicherverwaldung und Referenzzählung arbeiten. Ansonsten: Finger weg, von direkten Speichermanipulationen. (Pointer, Move und Co.) |
AW: BoolToStr wirft Access Violation
Zitat:
Zeiger belegen immer 4 Byte, deshalb sind alle Elemente des Arrays gleich groß. Das Element[i] wird mit Move überschrieben, ohne das die Speicherverwaltung der dort referenzierten Strings etwas mitbekommt. Diese Strings werden nie mehr freigegeben. Kann man so umgehen:
Delphi-Quellcode:
Nach dem Move verweist das letzte und das vorletzte Element auf die selben Strings, diese wissen aber nichts von der zusätzlichen Referenz. Das anschließende SetLength löscht das letzte Element und verringert den Referenzzähler der Strings. Dadurch werden diese freigegeben obwohl ja noch ein Element darauf verweist.
Finalize(MyArrayOfMyRecord[i]);
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i - 1], (Length(MyArrayOfRecord) - i) * Sizeof(MyRecord)); Kann man so umgehen:
Delphi-Quellcode:
FillChar(MyArrayOfMyRecord[Length(MyArrayOfRecord) - 1], Sizeof(MyRecord), #0);
SetLength(MyArrayOfMyRecord, Length(MyArrayOfRecord) - 1); |
AW: BoolToStr wirft Access Violation
Zusammenfassend lässt sich also sagen:
Delphi-Quellcode:
wird zu
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i-1], (length(MyArrayOfRecord)-i) * sizeof(MyRecord));
setlength(MyArrayOfMyRecord, length(MyArrayOfMyRecord)-1);
Delphi-Quellcode:
Finalize(MyArrayOfMyRecord[i]);
move(MyArrayOfMyRecord[i], MyArrayOfMyRecord[i-1], (length(MyArrayOfRecord)-i) * sizeof(MyRecord)); FillChar(MyArrayOfMyRecord[Length(MyArrayOfRecord) - 1], Sizeof(MyRecord), #0); setlength(MyArrayOfMyRecord, length(MyArrayOfMyRecord)-1); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 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