メンバ変数が他のクラスのオブジェクトへの boost::shared_ptrs である C++ クラス (dll プロジェクト内) があります。クラスコンストラクター内でそれらを割り当てる方が良いですか、それとも別の init() 関数を使用する方が良いですか?
通常、コンストラクターですべてを行う方が適切です。
後で呼び出される init() 関数を持つことは、オブジェクトが構築後に有効ではないことを意味するため、init() が呼び出されたかどうかを示す状態フラグを保持し、パブリック メソッドが呼び出されて実行されるたびにそのフラグをチェックする必要があります。初期化されていないオブジェクトに適したもの
boost::shared_ptr 内の T へのポインターのデフォルト値は NULL であると想定しています。したがって、コンストラクター内で何もしないと、boost::shared_ptr の get() は Init() 関数を呼び出す前に NULL を返します。
はい: shared_ptr の既定のコンストラクターは、それを NULL に初期化します。
また、割り当てステートメントの 1 つで new にメモリ割り当ての問題がある場合、(Init で) 例外をキャッチする必要がありますか、それともこの Init() の呼び出し元にその例外をキャッチするように指示するのがよいでしょうか? boost::shared_ptr a( new T);
コンストラクターがある場合: 構築されたすべてのメンバーは (デストラクターを介して) 正しく破棄されますが、ユニット化されたオブジェクトは変更されず、現在のオブジェクトのメモリは割り当てられていないかのように解放されます (使用する別の正当な理由)イニシャライザリスト)。
init() を使用する場合: 次に、例外をキャッチしてオブジェクトを正しくクリーンアップし、メモリを解放する必要があります。オブジェクトの複雑さに応じて、init 内でこれを実行できる場合 (ただし、正しく実行するのは難しい)、または呼び出し元が実行する必要があります。その後、コンストラクターから例外がスローされた場合と同じことを行う必要があります (使用方法によって異なります)。
単体テスト内でメモリ割り当ての例外をシミュレートする標準的なアプローチはありますか? すべてのオブジェクトが適切に割り当て解除されていることを確認します
ファクトリ オブジェクトを使用してオブジェクトを割り当てることができます。
ファクトリ オブジェクトをコンストラクタに渡します。構築中に例外をシミュレートしたい場合は、その適切な例外を生成するモック ファクトリを渡すだけです。