2017-01-09 4 views
0

私はクラスを開発しました。プログラムの存続期間中に発生したことの「履歴」を保持できるオブジェクトが必要です。オブジェクト初期化用の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; 

クラスTPipelineSimulatorhistory変数に文字列を追加し、通常の手順(ないクラス手順)を持っています。私はこのコードで私のSTRINGLISTとアクセスそれを埋めることができ、このように:

for k := 0 to a.history.Count-1 do 
    Memo1.Lines.Add(a.history.Strings[k]); 

オブジェクトが作成され、その後解放された場合でも、これは非常に便利である(内部の通常のFreeてみ-最後に)私はまだ文字列リストにアクセスできます。私はクラスのコンストラクタとデストラクタについて2つの質問があります。

  1. documentationは、コンストラクタは、初期化セクションにコンパイラによって自動的に挿入されていることを述べています。逆はデストラクタで発生します。これは、ボタンonclickプロシージャ内でvar a: TPipelineSimulator;を呼び出すと、プログラムの開始時にaのクラスコンストラクタが呼び出されることを意味しますか?それとも初めて私がプロシージャを呼び出すとき?

  2. 例外が発生した場合(誤って文字列リストの範囲外に出ることがあります)、メモリリークの危険がありますか?

ポイント2では、このような意味です。 STRINGLISTは、1つの項目ごとに充填されている場合は、最初に以下のコードは、境界のうち数回、エラー原因:私はまだSTRINGLISTにアクセスできることにもかかわらず

showmessage(a.history.strings[10]); 

を、私は本当にこのコード場合は疑問に思っています危険です。

+0

範囲外のエラーに関する無意味な推論。ちょうどそれらを修正する。コードが壊れています。あなたがその場合に漏れるかどうか誰が気にしますか?あなたはもっと大きな問題を出しました。初期化とファイナライズ時の例外については、それは起こりません。あなたはそれがしないことを確認する必要があります。もしそうなら、あなたは再びそれを回復することはできません。漏れはあなたの心配ではありません。ゲームがアップしています。 –

+0

生涯に例外が発生した場合、私は何もできないことを私に伝えていますか? (通常、デストラクタは普通のコンストラクタ/デストラクタで普通に起こるように、自動的に呼び出されないので) –

+0

例外が発生した場合、それが起こります。もちろん、あなたは何かをすることができます。しかし、それはクラスのコンストラクタの中で起こるべきではなく、確かにクラスのデストラクタの内部で起こるべきではありません。 –

答えて

2

1)クラスコンストラクタは、クラスが実装されているユニットの初期化セクション(正確には、初期化セクションのコードの直前)で実行されます。デストラクタの場合、これは逆の方法です。ユニットの初期化順序は、コンパイラによって決定されます。

初期化/終了セクションコードとの違いは、クラスが実際にプログラムの内部で使用される場合にのみ、クラスコンストラクタ/デストラクタが実行されることです。

2)クラスデストラクタが呼び出されている限り、少なくともこの文字列リストからはメモリリークはありません。

関連する問題