加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

哪些变量在Delphi中初始化?

发布时间:2020-12-15 05:22:10 所属栏目:大数据 来源:网络整理
导读:所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是。我也听说记录成员(也是基于堆栈)也没有初始化。编译器警告局部变量未初始化([DCC警告] W1036变量’x’可能尚未初始化),但不会对记录成员发出警告。所以我决定运行一个测试。 我总是得到0从整
所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是。我也听说记录成员(也是基于堆栈)也没有初始化。编译器警告局部变量未初始化([DCC警告] W1036变量’x’可能尚未初始化),但不会对记录成员发出警告。所以我决定运行一个测试。

我总是得到0从整数和假从布尔人所有记录成员。

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

我缺少什么?我在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 0
i2 0
i3 0
i4 0
i5 0
S
Booleans: FALSE FALSE FALSE FALSE FALSE
Array
0 0 0 0 0 0 0 0 0 0 0
Done . . . .

解决方法

全局变量是零初始化的。在程序的main begin..end块的上下文中使用的变量可以是特殊情况;有时它们被当作局部变量,特别是for-loop索引器。但是,在您的示例中,r是一个全局变量,并从可执行文件的.bss部分分配,Windows loader确保它是零填充。

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

> AnsiString
> UnicodeString
> WideString
>接口类型(包括方法引用)
>动态数组类型
>变体

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读