Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt
Online

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Zugriffsverletzung beim Kürzen eines dyn. Arrays

  Alt 25. Jan 2012, 12:01
Das Array ist folgendermaßen aufgebaut:

Delphi-Quellcode:
  Sortierung = Record
  iRegalPlatz : Integer; // Regalplatz-Nr.
  iPosiPlatz : Integer; // Kistenplatz-Nr. im Regalplatz
  iKistePlatz : Integer; // Kisten-Nr.
  iStueckPlatz : Integer; // Stückzahl in der Kiste
  Datum : TDateTime; // Einlagerungsdatum
  Barcode : String; // Inhalt des Strings des Barcodes
  end;

  FeldPlatz : Array of Sortierung;
Also funktionieren tut es insgesamt schon. Nur eben wenn AIndex 0 ist, bzw. das Feld die Länge 1 hat, tritt der Fehler auf.
Und du hast nicht $H-/$LONGSTRINGS OFF, d.h. Barcode ist ein referenzgezählter Typ? Dann verursacht das Move Probleme, selbst wenn du sie nicht sofort um die Ohren geknallt kriegst. Überleg mal: Angenommen Feldplatz hat noch zwei Elemente und du rufst Loesche_Array_Element(0) auf. Dann wird der Record Feldplatz[1] auf Feldplatz[0] ge-move-t, d.h. Feldplatz[0].Barcode und Feldplatz[1].Barcode verweisen auf den gleichen String, haben aber trotzdem nur Referenzzähler 1. Beim nachfolgenden Aufruf von SetLength wird Feldplatz[1] finalisiert, was insbesondere den Referenzzähler von Feldplatz[1].Barcode dekrementiert und, da 0 rauskommt, den String entsorgt. Dummerweise zeigt Feldplatz[0].Barcode jetzt auf einen freigegebenen Speicherbereich. Das kracht nicht zwangsweise sofort, ist aber trotzdem übel.
Uli Gerhardt
  Mit Zitat antworten Zitat