имам следния примерен код, компилиран в delphi xe5 актуализация 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
винаги се нулира до 0
, когато достигне 3
.
ако разпределя паметта сам с SetLength(buf,20);
, всичко е наред.
снимката показва какво имам предвид.
моята настройка:
- Windows 7 64 бита
- Delphi XE 5 Актуализация 2
- Конфигурация за отстраняване на грешки 32 бита
странно, нали?
някой може ли да го възпроизведе?
дали е грешка в компилатора на delphi?
Благодаря.
РЕДАКТИРАНЕ:
ето същия пример, но може би е по-добре да разберете какво имам предвид:
и между другото: съжалявам за лошия ми английски ;)