Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#10

AW: Cast Array[0..x] of Byte in TBytes

  Alt 30. Jun 2011, 13:32
Auch wenn es sich im programmtechnischen Sinn um verschiedene Typen handelt (dynamisches vs. statisches Array), so liegen dennoch in beiden Fällen die Daten byteweise hintereinander. Damit haben sie sehr wohl das selbe Speicherlayout.
Das gilt sicher für die Nutzdaten, nicht aber für die Länge des Arrays und die Referenzzählung. Selbst wenn das im aktuellen Fall nicht relevant sein sollte, besteht immer die Gefahr, das dieses Konstrukt in einer zukünftigen Version nicht mehr funktioniert.

Das tatsächliche Speicherlayout kann man hier nachlesen. Das dynamische Array ist also ein Pointer auf die Nutzdaten, wobei der Bereich vor den Nutzdaten aber noch zum Array gehört. Demnach ist der Cast auf das statische Array einfach nur brandgefährlich, weil die 8 Byte vor dem Array nun als Größe und als Referenzzähler interpretiert werden. In dem Längenfeld kann alles möglich drinstehen und es kann sich sogar jederzeit ändern - heißt: die verwendete Länge passt nicht zur wirklichen Größe des Arrays. Dann kann es auch noch passieren, daß der Compiler dann noch bei der Referenzzählung das Array einfach frei gibt (das wird spaßig). Wenn es nicht crasht ist das einfach nur Glück.

Beiliegendes Projekt zeigt das ganz deutlich - und es crasht auch beim Beenden.

Insofern bleibe ich bei meiner Aussage, daß das Speicherlayout unterschiedlich ist.
Angehängte Dateien
Dateityp: zip Projekt88.zip (1,2 KB, 16x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat