![]() |
1
12
kjack, 它包含当时堆栈帧中的任何值。在您的情况下,这将是发件人。如果你取整数并将其类型转换为对象,你会注意到“模式”。
|
![]() |
2
5
首先,你是对的,局部变量 aren't initialised .
你也不能保证
声明,因为它没有效果。(您可以添加另一个
|
![]() |
3
2
为了测试这一点,您可以添加另一个带有OnClick处理程序的按钮,该处理程序调用的方法具有比ShowMessage()更多的参数。如果在两次单击Button1之间单击该按钮,int1的值确实应该会发生变化。这是因为Button1Click()中int1的堆栈位置将用于其他处理程序中的一个参数,并被覆盖。 应该优化分配,你可以看到这一点,因为线条在空白区域不应该有蓝点。还应该有编译器提示。 编辑: 正如您所评论的,当点击另一个按钮时,行为似乎没有变化。由此,我只能假设VCL代码(在调用OnClick处理程序之前执行)使用了如此多的堆栈空间,以至于int1的内存位置总是用一些(稳定的)值初始化。此代码总是相同的,因此如果所涉及对象(应用程序、父窗体和按钮)的地址没有改变,则值也将保持不变。OTOH重启应用程序将在未初始化的局部变量中产生一个新的、同样稳定的值。 请注意,这完全取决于在处理程序之前执行的VCL代码,因此对VCL的更改也可能会改变它。甚至可能是各种Delphi版本的行为已经不同了。 |
![]() |
4
1
局部变量位于堆栈帧中。而且它们没有初始化。 如果你访问一个方法两次,那么堆栈指针就有可能是euqal,它给出了相同的值。 例子: 调用前堆栈:
如果调用Button1Click,堆栈如下:
如果下一次调用Button1Click时,堆栈指针仍在位置X上,并且没有其他函数更改了值,您将为Int1找到相同的值。 如果你有安全的信息,清除局部变量总是明智的(但你有机会让优化器删除这些状态。所以你需要禁用优化)。 为了好玩,添加另一个按钮:
并检查:
|
![]() |
5
1
你希望它是一样的吗?如果是这样,你可以使用局部const:
不过,您必须确保“可分配类型常量”已打开。 |
![]() |
6
0
初始化变量可能由内存管理器完成,也可能不由其完成。
|
![]() |
Some1Else · 函数在Delphi中重新创建TForm 3 年前 |
![]() |
Agmcz · Delphi安卓库。so未安装(AAB) 3 年前 |
![]() |
nader · 如何使用delphi在web上提交表单 7 年前 |
![]() |
kwadratens · Delphi中的卡方分布函数代码 7 年前 |
|
user9672569 · 如何在完整的位图图像中绘制阴影效果? 7 年前 |
![]() |
mmmm · MSBuild(用于Delphi)Make-like功能 7 年前 |