我是新来的德尔菲,我一直跑一些测试看到什么目的变量和堆变量初始化为默认:

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

这是行为的我用来自其他语言,但我想知道它是否是安全的依赖它在德尔菲?例如,我想知道,如果它可能取决于一个编译器的设定,或许以不同的方式工作,在不同的机器。这是正常依赖默认初始化价值观的对象,或者你中明确设置的所有实例中的变量构造?

作为堆(过程级)的变量,我的测试显示,布尔未初始化是真实的,未初始化整数2129993264,并uninialized的对象,都是无效的指针(即不无)。我猜规范是总是设定过程级别的变量之前,访问他们吗?

有帮助吗?

解决方案

是的,这是记录行为:

  • 对象的领域总是初始化为0,0.0,"、虚假、无或任何适用。

  • 全球变量总是初始化为0等;

  • 当地基准计算*变量总是初始化为零或";

  • 本地无基准计算*变量的初始化所以你必须分配一个值,然后才能使用它们。

我记得那 巴里*凯利 某个地方写了一个定义为"参数",但无法找到任何更多,所以这应该做的,在此期间:

参考计数==,参考-算本身,或 直接或间接地包含的领域(用于记录)或单元(为 阵列),被引用计数,如: string, variant, interface动态阵列静态阵列 含有这样的类型。

注:

  • record 本身不足以成为参考计数
  • 我没有尝试过这种与泛型呢

其他提示

没有显式初始化程序的全局变量在可执行文件的BSS部分中分配。它们实际上并没有占用EXE中的任何空间; BSS部分是OS分配并清除为零的特殊部分。在其他操作系统上,有类似的机制。

您可以依赖零初始化的全局变量。

类字段默认为零。这是记录在案的,所以你可以依赖它。 除非字符串或接口设置为零,否则本地堆栈可变量是未定义的。

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

var myGlobal:integer=99;

以下是Ray Lischners Delphi在果壳中的引用第2章

  

"当Delphi首次创建一个对象时,所有字段都开始为空,即指针初始化为nil,字符串和动态数组为空,数字值为零,布尔字段为False,变量为设置为“未分配”。 (有关详细信息,请参阅第5章中的NewInstance和InitInstance。)“

确实需要初始化本地范围内的变量......我会将上面的注释视为“全局变量已初始化”。直到提供参考为止仍然可疑 - 我不相信。

...编辑 Barry Kelly说你可以依赖它们进行零初始化,因为他在Delphi编译器团队中,我相信这就是:)感谢Barry。

全局变量和对象实例数据(字段)始终初始化为零。 程序和方法中的局部变量未在Win32 Delphi中初始化;在代码中为它们分配值之前,它们的内容是未定义的。

即使某种语言提供默认初始化,我也不相信你应该依赖它们。初始化为某个值会使其他开发人员更加清楚,这些开发人员可能不了解该语言中的默认初始化并防止编译器出现问题。

来自Delphi 2007帮助文件:

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

  

"如果没有显式初始化全局变量,编译器会将其初始化为0.“

我对答案给出了一点抱怨。 Delphi将全局变量和新创建的对象的内存空间清零。虽然这个 NORMALLY 意味着它们被初始化,但有一种情况它们不是:具有特定值的枚举类型。如果零不是合法值怎么办?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top