由于 caskey 的回答只涉及 c++ 我对 delphi 的回答:
在德尔福,请参考Giacomo Degli Esposi的这个答案
- 对象字段始终初始化为 0、0.0、''、False、nil 或任何适用的值。
- 全局变量总是被初始化。(到 0)
- 局部变量是未初始化的,因此您必须先分配一个值才能使用它们。
ms-help://borland.bds4/bds4ref/html/Variables.htm
贾科莫·德格利·埃斯波斯蒂的所有学分
编辑:“ Windows 是否保证在第一次将内存分配给程序的堆栈或堆时对其进行零初始化? ”
Windows 保证在首次将内存分配给新进程时将内存初始化为零(否则,您将遇到一个很大的安全问题,即程序能够读取其他进程丢弃的内存,而不管权限如何)。但是,使用 c++,这种保证对您没有多大帮助,因为 c-runtime 可以在您的代码有机会使用它之前自行决定覆盖内存。
Edit2:对于 C++ 构建器变量显然是为“ VCL 样式类”初始化的(无论这意味着什么,都是从 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 的构造函数中引发异常。因为 Base 是在 Derived 之前构造的,not_zero 尚未使用传递给构造函数的值 42 进行初始化。请注意,在调用其基类构造函数之前,您不能初始化 VCL 样式类的数据成员。”