1. ホーム
  2. delphi

[解決済み] delphiの変数はデフォルトで値で初期化されるのですか?

2022-11-13 11:05:22

質問

私は Delphi の初心者ですが、オブジェクト変数とスタック変数がデフォルトでどのように初期化されるかを確認するためにいくつかのテストを実行しました。

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

これは私が他の言語から慣れている動作ですが、私はそれがDelphiでそれに依存しても安全であるかどうか疑問に思っています? 例えば、コンパイラの設定に依存するのか、あるいは、異なるマシン上で異なる動作をするのか、疑問に思っています。 オブジェクトのデフォルトの初期化値に依存するのは普通ですか、それともコンストラクタですべてのインスタンス変数を明示的に設定するのでしょうか?

スタック (手続きレベル) 変数については、私のテストでは、ユニット化されたブール値は真、ユニット化された整数は 2129993264、ユニット化されていないオブジェクトは単なる無効なポインタ (すなわち nil ではない) であることが示されています。 私は、標準は常にプロシージャ レベルの変数にアクセスする前に設定することだと推測しています。

どのように解決するのですか?

はい、これは文書化された動作です。

  • オブジェクトフィールドは常に0、0.0、''、False、nilまたは適用される何れかに初期化されます。

  • グローバル変数も同様に、常に0などに初期化されます。

  • ローカル参照カウント*の変数は、常にnilまたは''に初期化されます。

  • ローカルな非参照カウント*変数は初期化されないので、使用する前に値を代入する必要があります。

そういえば バリー・ケリー は、どこかで "reference-counted" の定義を書いたと記憶していますが、もう見つけることができないので、とりあえずこれで大丈夫でしょう。

参照カウントされるもの == それ自身が参照カウントされるもの、または 直接または間接的に参照カウントされるフィールド (レコードの場合) または要素 (配列の場合) を含むもの。 配列)を直接または間接的に含むもので、そのようなものは参照カウントされます。 string, variant, interface または 動的配列 または 静的配列 を含む静的な配列です。

注意事項

  • record は、それ自体では参照カウントされるのに十分ではありません。
  • 私はまだジェネリックスでこれを試していません