Weil der String halt nicht so arbeitet
str ist ja "nur" ein pointer auf die Stringstruktur
Code:
RRRRCCCCDDDDDDDDDDDDDDDDDDDDDDD.....#0
^ ^ ^ ^
^ ^ ab hier sind dann alle Elemente (Zeichen) aufgereit
^ Elemete im Array ... entspricht beim String der Zeichenanzahl
Refferenzzähler ^
^ ^
^____________________________________^
diese Daten liegen [b]einem[/b] Speicherblock
der Zeiger in str zeigt zwar nicht wie allgemein üblich auf den Anfang des resservierten Datenbereichs, sonden aud das erste Zeichen,
dies ist allerdings nur weil es halt so einfacher ist den string nach PChar zu casten.
zur Speicherverwaltung wird demnach immer PInteger(str)-2*SizeOf(Integer) an GetMem, ReallocMem und FreeMem geleitet.
Und da gibt es Probleme, sobald du den String mal verändernfreigeben willst
Length arbeitet ja auch nur mit PInteger(PInteger(str)-SizeOf(Integer))^, was auch falsche werte liefern würd, wenn dman daran rumfummelt.