У меня есть следующий пример кода, скомпилированный в delphi xe5 update 2.
procedure TForm1.FormCreate(Sender: TObject);
var i,t:Integer;
buf: array [0..20] of TPair<Integer,Integer>;
begin
t := 0;
for i := Low(buf) to High(buf) do begin
ShowMessage(
Format(
'Pointer to i = %p;'#$d#$a+
'Pointer to buf[%d].Key = %p;'#$d#$a+
'Pointer to buf[%d].Value = %p;'#$d#$a+
'Pointer to t = %p',
[@i, i, @(buf[i].Key), i, @(buf[i].Value), @t]
)
);
buf[i].Key := 0;
buf[i].Value := 0;
t := t + 1;
end;
end;
если я запустил его, он показывает мне адреса переменных.
переменные i
и t
имеют адреса в диапазоне памяти buf
!
когда i
достигает 3, присваивание buf[i].Value := 0;
перезаписывает первые 3 байта i
и последний байт t
. это приводит к циклу бесконечности, потому что i
получает все reset до 0
, когда он достигает 3
.
если я сам выделяю память с помощью SetLength(buf,20);
, все в порядке.
изображение показывает, что я имею в виду.
моя настройка:
- Windows 7 64 бит
- Обновление Delphi XE 5 2
- Конфигурация отладки 32 бит
странно, не так ли?
может ли кто-нибудь воспроизвести его?
это ошибка в компиляторе delphi?
спасибо.
EDIT:
вот тот же пример, но, возможно, лучше понять, что я имею в виду:
и btw: извините за мой плохой английский;)