我如果用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();
}
{//::CoInitialize( NULL ); //如果在这里初始化,则要注意智能指针的释放 CComQIPtr < IFun, &IID_IFun > spFun;
HRESULT hr = spFun.CoCreateInstance( CLSID_Fun );
ASSERT( SUCCEEDED( hr ) ); ....//使用指针
spFun.Release(); // 正解 //::CoUninitialize();
}
为什么呢?+_+
原因在于原来的CoInitialize所开的套间在CoUninitialize();后已经被关闭。
而智能指针的组件对象却并没有释放,直到程序调用CComPtr<ITestCOMPtr>的析构函数时才调用
ITestCOMPtr的Release方法,但是这时候,套间已经不在了,所以导致了程序的崩溃。在组件
的生命周期很短的时候,智能指针的使用基本是无害的,并且有时是非常方便的。所以在使用智能指针时有以下建议:
1. 当对象的生命周期很长要小心使用。
2. 当对象的生命周期不确定时不要使用。
3. 千万不要使用全局的智能指针。