gpt4 book ai didi

delphi - Delphi 中哪些变量被初始化?

转载 作者:行者123 更新时间:2023-12-03 14:33:02 26 4
gpt4 key购买 nike

所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量没有被初始化。我还听说记录成员(也是基于堆栈的)也没有初始化。编译器会警告局部变量未初始化([DCC 警告] W1036 变量“x”可能尚未初始化),但不会针对记录成员发出警告。所以我决定进行一次测试。

对于所有记录成员,我总是从整数中得到0,从 bool 中得到

我尝试打开和关闭各种编译器选项(调试、优化等),但没有任何区别。我的所有记录成员正在初始化。

我错过了什么?我使用的是 Delphi 2009 Update 2。

program TestInitialization;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TR = Record
Public
i1, i2, i3, i4, i5: Integer;
a: array[0..10] of Integer;
b1, b2, b3, b4, b5: Boolean;
s: String;
End;

var
r: TR;
x: Integer;

begin
try
WriteLn('Testing record. . . .');
WriteLn('i1 ',R.i1);
WriteLn('i2 ',R.i2);
WriteLn('i3 ',R.i3);
WriteLn('i4 ',R.i4);
WriteLn('i5 ',R.i5);

Writeln('S ',R.s);

Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' ', R.b4, ' ', R.b5);

Writeln('Array ');
for x := 0 to 10 do
Write(R.a[x], ' ');
WriteLn;

WriteLn('Done . . . .');
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
ReadLn;
end.

输出:

Testing record. . . .i1 0i2 0i3 0i4 0i5 0SBooleans: FALSE FALSE FALSE FALSE FALSEArray0 0 0 0 0 0 0 0 0 0 0Done . . . .

最佳答案

全局变量被零初始化。在程序的主 begin..end block 上下文中使用的变量可能是一种特殊情况;有时它们被视为局部变量,特别是 for 循环索引器。但是,在您的示例中,r 是一个全局变量,从可执行文件的 .bss 部分分配,Windows 加载程序确保该变量为零填充。

局部变量的初始化就像它们被传递到Initialize例程一样。 Initialize 例程使用运行时类型信息 (RTTI) 将字段(递归地 - 如果字段是数组或记录类型)和数组(递归地 - 如果元素类型是数组或托管类型的记录),其中托管类型是以下之一:

  • AnsiString
  • Unicode字符串
  • 宽字符串
  • 接口(interface)类型(包括方法引用)
  • 动态数组类型
  • 变体

堆中的分配不一定要初始化;这取决于使用什么机制来分配内存。作为实例对象数据一部分的分配由 TObject.InitInstance 进行零填充。 AllocMem 的分配是零填充的,而 GetMem 的分配不是零填充的。来自 New 的分配被初始化,就像它们被传递给 Initialize 一样。

关于delphi - Delphi 中哪些变量被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/861045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com