コピーコンストラクタを忘れて、痛い目に遭った

以前作成したCOMオブジェクトの自作ラッパクラスを再利用したところ、同じアプリケーションをベースに作成しているにもかかわらず、原因不明のアクセス違反が発生。。。

デバッガと格闘する事小一時間。。。

問題のコードを発見。

class ComWrapA
{
public:
    ComWrapA()
    {
        ::CoInitialize(NULL);
    }
    
    ~ComWrapA()
    {
        ::CoUninitialize();
    }
    
    //...
};


むむむ、、、、
これ、コピーされるとどうなるの?

コピーされると、コンストラクタは呼ばれない。
でも、デストラクタは呼ばれる。
だから、

::CoInitialize(NULL);
::CoUninitialize();
::CoUninitialize();


の様に、1回しか CoInitialize していないにもかかわらず、2回も CoUninitialize が呼ばれてしまう。

実は、このクラスを作成する前にインスタンス化した別のCOMコントロールが、このクラスを使い終わった時点で CoUninitialize によって、強制解放されてしまっていたのでした。。。

これは、コピーコンストラクタで以下のようにして回避する必要があります。

ComWrapA(ComWrapA& org)
: member(org.member)
{
    ::CoInitialize(NULL);
}


C++のクラスをコピーって、結構面倒です。
[PR]
by isoq | 2005-12-21 15:46 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 風邪っぴき NaiNai v1.1.0 β... >>