delphivariables是否默认初始化了一个值?

我是Delphi的新手,我一直在运行一些testing,以查看默认情况下初始化了哪些对象variables和堆栈variables:

TInstanceVariables = class fBoolean: boolean; // always starts off as false fInteger: integer; // always starts off as zero fObject: TObject; // always starts off as nil end; 

这是我习惯于其他语言的行为,但是我想知道在Delphi中依赖它是否安全? 例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作。 依赖于对象的默认初始化值是正常的,还是显式设置构造函数中的所有实例variables?

至于stack(procedure-level)variables,我的testing显示单位化的布尔值是真的,单位化的整数是2129993264,而未经初始化的对象只是无效的指针(即不是零)。 我猜的规范是在访问它们之前总是设置过程级别的variables?

是的,这是logging的行为:

  • 对象字段总是被初始化为0,0.0,'',假,零或任何适用。

  • 全局variables总是初始化为0等。

  • 本地引用计数*variables始终初始化为零或“;”

  • 本地非引用计数*variables未初始化,所以您必须先分配一个值,然后才能使用它们。

我记得巴里·凯利 ( Barry Kelly)在某处写了一个“引用计数”的定义,但是再也找不到它了,所以应该这样做:

引用计数==自身引用计数,或直接或间接包含引用计数的字段(对于logging)或元素(对于数组),如: string, variant, interfacedynamic数组或包含此types的静态数组

笔记:

  • record本身不足以成为参考
  • 我还没有尝试过这种generics

不具有显式初始值设定项的全局variables将在可执行文件的BSS部分中分配。 他们实际上并没有在EXE中占用任何空间。 BSS部分是OS分配并清零的特殊部分。 在其他操作系统上,也有类似的机制。

你可以依靠全局variables被初始化。

类字段是默认的零。 这是logging在案,所以你可以依靠它。 本地堆栈variables不确定,除非string或接口被设置为零。

正如旁注(因为您是Delphi的新手):全局variables可以在声明时直接初始化:

 var myGlobal:integer=99; 

Ray Lischners Delphi在第二章简单介绍了一段话

“当Delphi第一次创build一个对象时,所有的字段都是空的,也就是说,指针初始化为零,string和dynamic数组为空,数字为零,布尔型为False,variables为Unassigned。 (有关详细信息,请参阅第5章中的NewInstance和InitInstance。)“

确实,局部范围内的variables需要初始化……我将上面的“全局variables初始化”的注释视为可疑,直到提供参考 – 我不相信。

编辑…巴里凯利说,你可以依靠他们被零初始化,因为他是在Delphi编译器团队,我相信,立场:)谢谢巴里。

全局variables和对象实例数据(字段)始终初始化为零。 程序和方法中的局部variables不在Win32 Delphi中初始化; 他们的内容是不确定的,直到你给他们分配一个代码值。

从Delphi 2007帮助文件:

MS-帮助://borland.bds5/devcommon/variables_xml.html

“如果你没有明确地初始化一个全局variables,编译器将它初始化为0”

我有一个小小的抱怨给出的答案。 Delphi将全局variables和新创build的对象的内存空间清零。 虽然这通常意味着它们被初始化,但有一种情况是它们不是:具有特定值的枚举types。 如果零不是一个合法的价值?

即使语言确实提供了默认的初始化,我也不相信你应该依赖它们。 初始化为一个值可以让其他开发人员更清楚,他们可能不知道语言中的默认初始化,并防止编译器出现问题。