2013-06-04 13 views
6

長年使用されてきたTMyValueレコードの設計上の瑕疵を修正したいのですが、パブリックインターフェイスの変更を避けるためにレコード自体に修正が必要なことは間違いありません。コードを変更するレコードを使用します。スタックレコードの初期化を保証する

本質的に、この欠陥は、TMyValueが作成時にゼロに初期化されなければならないという欠点があります。そうでなければ、Clearメソッドを呼び出すとクラッシュする可能性があります。これは、ポインタがnilでない場合に動的に割り当てられたメモリへのポインタであるフィールドを含み、Clearによって動的メモリが解放されるためです。

これは、スタック変数が作成時に自動的にゼロにされないため、TMyValueがスタック上に作成された場合に問題になります。

私はレコードコンストラクタを使ってレコードをゼロにすることができると考えましたが、レコードコンストラクタはパラメータなしにはできません。これは、レコードがスタック上に作成されたときに自動的にレコードコンストラクタが実行されるように強制することはできないと考えられます。

私の質問に対する答えは「できません」と思われます。私が間違っていることを証明してください!

答えて

7

ダミーの文字列メンバーをレコードに追加します。 文字列はマネージ型なので、レコードがスコープに入ったときに空文字列に初期化されます。

したがって、Clearメソッドを呼び出すときは、ダミー文字列が最初に空であるかどうかをテストします。 文字列を使用ロジックに適切な値に設定して、レコードを初期化済みとしてマークします。

+0

ニース。私はいつもあなたの人生をよりコンパクトにするのが好きです。 –

+1

@MarjanVenema、いくつかの技を知っているのはいつもいいです。しかし、レコードの初期化/終了ルーチンを宣言できることは、数年前に実装されていたはずです。 ['QC21729 Record Operator Overloading:「Initialize」と「Finalize」演算子」を実装してください(http://qc.embarcadero.com/wc/qcmain.aspx?d=21729)。私は、すべての組み込みプロシージャもクラス演算子を持つレコードで使用できるはずであることを付け加えたいと思います。私はコピー、高、低、長さ、SetLength等を意味する –

+0

ああええ!私が入力すると投票... –

関連する問題