由于 caskey 的回答只涉及 c++ 我对 delphi 的回答:
在delphi中通过Giacomo Degli Esposti引用this answer
- 对象字段始终初始化为 0、0.0、''、False、nil 或任何适用的值。
- 始终初始化全局变量。 (到 0)
- 局部变量是未初始化的,因此您必须先分配一个值才能使用它们。
ms-help://borland.bds4/bds4ref/html/Variables.htm
所有致谢Giacomo Degli Esposti
编辑:“Windows 是否保证在第一次将内存分配给程序的堆栈或堆时将其初始化为零?”
Windows 保证在首次将内存分配给新进程时将其初始化为零(否则,您将遇到一个很大的安全问题,即程序能够读取其他进程丢弃的内存而不管权限如何)。然而,使用 c++ 这个保证对你没有多大帮助,因为 c-runtime 可以在你的代码有机会使用它之前自行决定覆盖内存。
Edit2:对于 c++ 构建器变量显然是为“VCL-style classes”初始化的(无论如何,所有这些都继承自 TObject?),请参阅 http://docs.embarcadero.com/products/rad_studio/cbuilder6/EN/CB6_DevelopersGuide_EN.pdf
我引用:
“因为数据成员可能在虚函数中使用,重要的是
了解它们何时以及如何被初始化。在 Object Pascal 中,所有未初始化的数据
是零初始化的。例如,这适用于其构造函数为
不调用继承。 在标准 C++ 中,不能保证
未初始化的数据成员。以下类型的类数据成员必须是
在类的构造函数的初始化列表中初始化:
• 参考
• 没有默认构造函数的数据成员
尽管如此,这些数据成员的值,或那些在
构造函数,在调用基类构造函数时未定义。 在 C++Builder 中,
VCL 风格类的内存是零初始化的。
从技术上讲,它是 VCL 或 CLX 类的内存为零,即位是
零,这些值实际上是未定义的。例如,引用为零。
一个依赖于在
构造函数的主体或初始化列表中的变量可能表现为
初始化为零。这是因为基类构造函数在
处理初始化列表或进入构造函数体。
#include <sysutils.hpp>
class Base : public TObject {
public:
__fastcall Base() { init(); }
virtual void __fastcall init() { }
};
class Derived : public Base {
public:
Derived(int nz) : not_zero(nz) { }
virtual void __fastcall init()
{
if (not_zero == 0)
throw Exception("not_zero is zero!");
}
private:
int not_zero;
};
int main(void)
{
Derived *d42 = new Derived(42);
return 0;
}
本例在 Base 的构造函数中抛出异常。因为基地是
在 Derived 之前构造的 not_zero 尚未初始化为 42 的值
传递给构造函数。请注意,您无法初始化您的数据成员
在调用其基类构造函数之前的 VCL 样式类。”