我如果用CoInitialize(NULL)去初始化 COM library, 即使我定义的是智能指针, 当用完指针, 还是要调用release,不然会有泄漏, 但是如果我用AfxOleInit()代替CoInitialize()去初始化, 则不需要再加上spFun.Release();为什么?void test()
{//::CoInitialize( NULL ); //如果在这里初始化,则要注意智能指针的释放 CComQIPtr < IFun, &IID_IFun > spFun;
HRESULT hr = spFun.CoCreateInstance( CLSID_Fun );
ASSERT( SUCCEEDED( hr ) );        ....//使用指针
spFun.Release(); // 正解 //::CoUninitialize();
}

解决方案 »

  1.   

    如果你在CoInitialize(NULL);下行加上"{"和CoUninitialize();上行加上"}"就不会出错了。
    为什么呢?+_+
    原因在于原来的CoInitialize所开的套间在CoUninitialize();后已经被关闭。
    而智能指针的组件对象却并没有释放,直到程序调用CComPtr<ITestCOMPtr>的析构函数时才调用
    ITestCOMPtr的Release方法,但是这时候,套间已经不在了,所以导致了程序的崩溃。在组件
    的生命周期很短的时候,智能指针的使用基本是无害的,并且有时是非常方便的。所以在使用智能指针时有以下建议:
    1. 当对象的生命周期很长要小心使用。
    2. 当对象的生命周期不确定时不要使用。
    3. 千万不要使用全局的智能指针。