私はクラスを開発しました。プログラムの存続期間中に発生したことの「履歴」を保持できるオブジェクトが必要です。オブジェクト初期化用のDelphiクラスコンストラクタ
type
TPipelineSimulator = class
private
class var history: TStringList;
class constructor Create;
class destructor Destroy;
//other code
public
class property bitHistory: TStringList read history;
//other code
end;
とシンプルな実装です:
class constructor TPipelineSimulator.Create;
begin
history := TStringList.Create;
end;
class destructor TPipelineSimulator.Destroy;
begin
history.Free;
end;
クラスTPipelineSimulator
がhistory
変数に文字列を追加し、通常の手順(ないクラス手順)を持っています。私はこのコードで私のSTRINGLISTとアクセスそれを埋めることができ、このように:
for k := 0 to a.history.Count-1 do
Memo1.Lines.Add(a.history.Strings[k]);
オブジェクトが作成され、その後解放された場合でも、これは非常に便利である(内部の通常のFree
てみ-最後に)私はまだ文字列リストにアクセスできます。私はクラスのコンストラクタとデストラクタについて2つの質問があります。
documentationは、コンストラクタは、初期化セクションにコンパイラによって自動的に挿入されていることを述べています。逆はデストラクタで発生します。これは、ボタンonclickプロシージャ内で
var a: TPipelineSimulator;
を呼び出すと、プログラムの開始時にa
のクラスコンストラクタが呼び出されることを意味しますか?それとも初めて私がプロシージャを呼び出すとき?例外が発生した場合(誤って文字列リストの範囲外に出ることがあります)、メモリリークの危険がありますか?
ポイント2では、このような意味です。 STRINGLISTは、1つの項目ごとに充填されている場合は、最初に以下のコードは、境界のうち数回、エラー原因:私はまだSTRINGLISTにアクセスできることにもかかわらず
showmessage(a.history.strings[10]);
を、私は本当にこのコード場合は疑問に思っています危険です。
範囲外のエラーに関する無意味な推論。ちょうどそれらを修正する。コードが壊れています。あなたがその場合に漏れるかどうか誰が気にしますか?あなたはもっと大きな問題を出しました。初期化とファイナライズ時の例外については、それは起こりません。あなたはそれがしないことを確認する必要があります。もしそうなら、あなたは再びそれを回復することはできません。漏れはあなたの心配ではありません。ゲームがアップしています。 –
生涯に例外が発生した場合、私は何もできないことを私に伝えていますか? (通常、デストラクタは普通のコンストラクタ/デストラクタで普通に起こるように、自動的に呼び出されないので) –
例外が発生した場合、それが起こります。もちろん、あなたは何かをすることができます。しかし、それはクラスのコンストラクタの中で起こるべきではなく、確かにクラスのデストラクタの内部で起こるべきではありません。 –