アプリケーションに静的CComPtrメンバー変数を含めるのは悪い考えですか。静的変数の破棄を制御することはできず、CoUninitialzeの後に発生する可能性があるためです。
3 に答える
適切な予防策を講じればCComPtr
、静的メンバーとしてを使用することは本質的に悪ではありません。
「適切な予防措置」とは、次のことを考慮する必要があることを意味します。
- それへのミューテックスアクセス;
- 使用前に初期化されていることを確認します。
- 独自のクラスのミューテックスされた静的インスタンス数を維持します。
- インスタンス数がゼロに達したときに、
CComPtr::Release
クラス独自のメソッドで呼び出されるようにします。FinalRelease
とにかくそれは悪い考えです
セルゲイがコメントで言ったように、それは悪いことだと思います。静的オブジェクトのデストラクタは、C ++ 03標準のセクション3.6.3で説明されているように、メインが終了した後に呼び出されます。
静的ストレージ期間(ブロックスコープまたは名前空間スコープで宣言された)の初期化されたオブジェクトのデストラクタ(12.4)は、mainからの戻りの結果として、およびexit(18.3)の呼び出しの結果として呼び出されます。これらのオブジェクトは、コンストラクターの完了または動的初期化の完了とは逆の順序で破棄されます。オブジェクトが静的に初期化された場合、オブジェクトは動的に初期化された場合と同じ順序で破棄されます。配列またはクラスタイプのオブジェクトの場合、そのオブジェクトのすべてのサブオブジェクトは、サブオブジェクトの構築中に初期化された静的ストレージ期間を持つローカルオブジェクトが破棄される前に破棄されます。
そしてここでデモされたように:http://www.geeksforgeeks.org/static-objects-destroyed/。
ただし、メインスレッドのCOMライブラリをクリーンアップするCoUninitializeは、メインが終了する前に呼び出されます。CoUninitializeは、msdnのドキュメントで説明されているように、残りのすべてのリソースをクリーンアップします。CoUninitializeが呼び出される前にCOMオブジェクトのReleaseメソッドを呼び出す必要があります。これは、Comオブジェクトが後で存在しなくなるためです。したがって、CoUninitializeが呼び出される前に、CComPtrデストラクタの呼び出しが行われるようにする必要があります。したがって、CComPtrを静的にしないでください。