четверг, июля 05, 2012

Delphi XE2 Update 4 HotFix 1. А с дженериками до сих пор проблемы :(

Хотите получить Access Violation на абсолютно ровном месте, без намека на ухабы? Велком, как говорится:

program array_of_generic_record;

{$APPTYPE CONSOLE}

Uses

TypInfo;

Type

TRec<T> = Record
  FField : T;
End;

Var

a : Array Of TRec<TObject>;
i : Integer;
r : TRec<TObject>;

begin

WriteLn(SizeOf(TRec<TObject>)); // 4
WriteLn(GetTypeData(TypeInfo(TRec<TObject>))^.elSize); // 4

SetLength(A, 1000000); // but system.DynArraySetLength.elSize = 1; line 28288
                        // (DelphiXE2 update 4 hotfix 1); look at attached screenshot: bug.png

// absolutely normal code lead to access violation error
For i := Low(a) To High(a) Do
  a[i] := r;

end.

 

В общем, из описания понятно, что в системном модуле неверно получается размер элемента динамического массива. Из-за чего, понятное дело, памяти выделяется меньше и попытки работать с таким массивом приводят к краху. На дворе 2012 год. Блин, когда они уже нормальный компилятор осилят написать. Лучи ненависти вам, абракадабры :E

 

p.s. QC #106917

Комментариев нет: