描述:
我如果用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. 千万不要使用全局的智能指针。
您可能想查找下面的文章:
- visualc++60我想生成一个可执行程序release而不是调试debug一个,怎么生成出来的程序没有出现在release文件夹里面,甚至根本就没
- 作了一个atlcom在debug下一切正常,在Release下Build时出错,望高手指点!!
- VS2008编release版本报缺少mfcs42lib
- 我的atl组件debug版本注册成功并能正常调用,但releaseminidependence版本注册成功,但无法正常调用,说是我的类不存在??
- 重写QueryInterface,AddRef,Release应该注意些什么?我这段代码怎么总是有问题。
- 为什么用CComPtr<IObj>创建的对象不能Release,而用IObj创建对象指针,就可以Release?
- release运行出错MFC42DLL
- 关于Release函数中deletethis的问题
- VC6下调试runtocursor为什么不生效
- Debug版本出错Release版本运行正常是怎么回事?