[DUG] Sizeof record gives error
David Moorhouse (DUG)
delphi at moorhouse.net.nz
Thu Aug 25 11:40:22 NZST 2011
I have the following code snippet
<code>
type
PConstArray = ^TConstArray;
TConstArray = array of TVarRec;
function CreateConstArray(const Elements: array of const): TConstArray;
type
TLogType = (ltError, ltWarn, ltInfo);
PLogData = ^TLogData;
TLogData = record
LogType: TLogType;
LogArgs: TConstArray;
end;
....
procedure TUserClass.Log(const LogType: TLogType; const Args: array of
const );
var
LogData: PLogData;
begin
// size of record TLogData does not work
GetMem(LogData, sizeof(TLogData));
LogData.LogType := LogType;
// blows up on next line
LogData.LogArgs := CreateConstArray(Args);
// ... do some other stuff with the LogData item finally calling FreeMem
end;
function CreateConstArray(const Elements: array of const): TConstArray;
var
I: Integer;
begin
SetLength(Result, Length(Elements));
for I := Low(Elements) to High(Elements) do
Result[I] := // assign a TVarRec here
end;
</code>
The code that assigns the memory only assigns 8 bytes - and an access
violation ensues. If I replace the call to "sizeof" with the number 16,
the code works fine.
My understanding of dynamic arrays was that the compiler created a 4 byte
field before the first element that contained the length of the array.
So why does the sizeof function not reflect this ? And why do I need 16
bytes not 12 (4 for LogType + 4 for length of array + 4 for array
pointer)?
Also regardless of the number of items in the open array parameter, 16
bytes works, so it does not relate the length of the TConstArray.
Your thoughts ?
David
More information about the Delphi
mailing list