变量初始化 Delphi 10 里约

Variable initialization in Delphi 10 Rio

我公司已经使用Delphi几十年了,我们的核心程序是用很旧的版本制作的。它有大约 130 万行代码。

升级到Delphi10 Rio后,出现了一个大问题。我们的局部函数变量过去常常使用默认值初始化(整数为 0,布尔值为 false),现在看来它们不再是了。现在我所有的变量在创建时都会得到一个随机值,所以一个整数会得到类似于 408796 的值。

我想这不是新开发的问题,但我相信您可以在我们的大型代码库中看到这个问题。我们从未手动为这些变量分配默认值,因为它工作正常。 然而,对象变量一直存在这个问题。所有属性都有随机值,所以我们已经解决了这个问题。但是现在我们的程序完全崩溃了,因为所有计数器等都以高值而不是 0 开始。而且 运行 通过整个项目来解决这个问题需要几个月的时间。

是否有编译器选项可以更改此设置?似乎很倒退,他们会故意改变这一点,因为这很愚蠢。为什么要删除所有开发人员期望的功能?我实际上期望它会走另一条路,对象变量将不再需要手动默认值,并且它们可能实现垃圾收集器。不过好像Delphi已经严重倒退了?

如果有解决此问题的方法,请告诉我。

整数和布尔值等非托管类型的局部变量从未自动初始化。如果您有依赖它的代码,那么该代码总是被破坏。如果您的计划没有受到影响,那么这完全是偶然而不是计划。如果您启用了编译器提示和警告,编译器会告诉您这一点。

托管类型的所有变量都默认初始化。所有全局变量都是默认初始化的。所有 class 成员字段都默认初始化。它只是非托管类型的局部变量,以及使用未默认初始化的 GetMem 动态分配的内存。

您唯一的前进方向是修复您的代码以确保变量已初始化。使用编译器提示和警告来帮助您。