我对 Delphi 10.3 Rio 内联变量声明感到非常兴奋。但是我遇到了一个奇怪的问题,似乎我需要在它被内联声明后初始化记录:
program Project8;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils,classes;
procedure DoEvil;
//var sr:TSearchRec; //A
begin
//var sr:= default(TSearchRec); //B
var sr:TSearchRec; //C
sr.Name := EmptyStr; //D
FindFirst('*.*',faAnyFile,sr);
while sr.Name<>EmptyStr do
begin
Writeln(sr.name);
sr.Name := EmptyStr;
FindNext(sr);
end;
end;
begin
try
DoEvil;
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
如果我在线声明 sr,则代码可以正常工作:
- //A(旧式声明)或上线
- //B(带初始化的内联声明)。
但是,如果我在线声明 sr
//C 然后它在 //D 行崩溃,分别在第 26222 行的 system.pas 中:
MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt }
除了:
异常类 $C0000005 带有消息“0x0040ac98 的访问冲突:读取地址 0xfffffff9”。处理 Project8.exe (18928)
我会从地址 -6 假设字符串成员 sr.name 未初始化并且为零。
完整地说,Delphi 是新的 10.3 版本 1:Embarcadero® Delphi 10.3 版本 26.0.33219.4899 - 已安装更新 1