8
訪問時關閉捕捉打破我已經成功地減少這個問題,以這樣的:從一個嵌套的方法內訪問時局部變量嵌套方法
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Threading;
procedure Foo(AString: string);
var
LTask : ITask;
capturedString : string;
procedure Nested;
begin
try
WriteLn('Nested : ' + capturedString); { ! EIntOverflow (Win32) here }
except on E : Exception do
WriteLn(E.Message);
end;
end;
begin
capturedString := AString;
WriteLn('Local : ' + capturedString);
Nested;
LTask := TTask.Create(
procedure
procedure AnonNested;
begin
WriteLn(capturedString); { Removing this eliminates the problem }
end;
begin
end);
end;
begin
Foo('foo');
ReadLn;
end.
這裏capturedString
變量被損壞。一個Win32編譯提出了EIntOverflow
,一個Win64編譯寫出一個(損壞的)空字符串 - 任何一個編譯都可以通過一些操作被引入到AV或其他異常中,但是在所有情況下,當進入Nested
過程時,對局部變量的引用都會被破壞。
這似乎只發生在閉包中捕獲到capturedString
時。
怎麼回事?