caskey の回答は c++ のみに関するものであるため、デルファイに対する私の回答は次のとおりです。
デルファイでは、 Giacomo Degli Espostiによるこの回答を参照してください
- オブジェクト フィールドは、常に 0、0.0、''、False、nil、または適用されるものに初期化されます。
- グローバル変数は常に初期化されます。(0まで)
- ローカル変数は初期化されているため、使用する前に値を割り当てる必要があります。
ms-help://borland.bds4/bds4ref/html/Variables.htm
ジャコモ・デリ・エスポスティのすべてのクレジット
編集:「Windowsは、メモリが最初にプログラムのスタックまたはヒープに与えられたときに、メモリがゼロで初期化されることを保証しますか?」
Windows は、メモリが新しいプロセスに最初に与えられたときに、メモリがゼロで初期化されることを保証します (そうしないと、アクセス許可に関係なく、他のプロセスが破棄したメモリをプログラムが読み取ることができるという大きなセキュリティ上の問題が発生します)。ただし、c++ を使用すると、コードがメモリを使用する前に c ランタイムがその裁量でメモリを上書きする可能性があるため、この保証はあまり役に立ちません。
Edit2 : C++ ビルダー変数は、明らかに「VCL スタイル クラス」用に初期化されます (つまり、TObject から継承するものはすべて?) 。 pdf
私は引用します:
「データ メンバーは仮想関数で使用される可能性があるため、それらがいつ、どのように初期化されるかを理解することが重要です。Object Pascal では、初期化されていないデータはすべてゼロで初期化されます。これは、たとえば、コンストラクターが呼び出されない基底クラスに適用されます。In standard C++, there is no guarantee of the value of uninitialized data members.次のタイプのクラス データ メンバーは、クラスのコンストラクターの初期化リストで初期化する必要があります。
ただし、これらのデータ メンバーの値、またはコンストラクターの本体で初期化された値は、基本クラスのコンストラクターが呼び出された時点では未定義です。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 スタイルのクラスのデータ メンバーを初期化できないことに注意してください。"