Eigentlich ist die Referenz -1 (steht normaler Weise für "liegt nicht im
RAM") .. bzw 1, wenn nur eine Refferenz vorhanden ist ... hier aber sicherheitshalber 2, damit es nicht unter blöden Umständen vorkommt, daß mal versucht wird den "nicht vorhandenen" Speicher freizugeben oder darin rumzuschreiben.
Delphi-Quellcode:
Type TDynArray =
packed Record
RefCount: LongInt;
ElementCount: LongInt;
Data:
packed Array[0..High(
{var})]
of {Typ};
End;
Var var: TMyDynArray;
var = @TDynArray.Data;
// die Variable zeigt auf den Anfang von Data
// Pointer(var) = nil > nil {in EXE} > nil {in RAM}
//
// RefCount = 0 = -1 > 0
// ElementCount = 0 = Length(var) = Length(var)
// @Data - = var = var
also man kann (zumindestens bei Strings, welche im Grunde auch nur ein dynamisches Array darstellen)
aus dem Pointer rausbekommen, ob es Inhalt gibt oder der String '' ist
und aus RefCount bekommt man mit wo der String liegt (-1 = Konstante, 0 gibt's nicht und größer 0 gibt es die Anzahl der Referenzen an)
PS: Beim alten Delphi-MemoryManager lag vor RefCount noch dein weiter Integer vom SpeicherManager (welcher Status des Speicherblocks angab)
[add]
Zitat von
SebE:
Edit: Warum legen dynamische Array keine Größen-/Referenz-Felder an?
bei
statischen Array's ist das anders angelegt.
da gibt es keine Referenzzählung und auch die Arraygröße ist nicht in die Datein eingebaut.
dieses sieht praktisch so aus:
Delphi-Quellcode:
Type TStaticArray = packed Record
Data: packed Array[0..High({var})] of {Typ};
End;
Length(array) und High(array) werden dabei direkt in das Programm eingebaut.
(die Länge kennt der Compiler ja und baut dann da wo diese Funktionen aufgerufen würden direkt die entsprechende Zahl ein)