关于COM智能指针的有关问题
关于COM智能指针的问题
有一种理论是 不要使用全局的智能指针
问题如下:
比如我在app的InitInstance()中通过AfxOleInit()来初始化COM
是不是只要我没有使用全局的智能指针
这些智能指针在COM“析构”(是不是叫析构?)之前 都会自动释放 而不用我自己手动释放
然而 如果 我在一个函数中:
void keep()
{
::CoInitialize( NULL );
CComQIPtr < IFun, &IID_IFun > spFun;
//这句是必须的
spFun.Release();
::CoUninitialize();
}
如果像上面代码那样初始化COM 在COM “析构”之前 必须主动释放 智能指针
我不知道这是为什么???
::CoUninitialize();之后 发生什么了? 意思是 COM“析构”之后 spFun就不能用了? 还是什么意思
请教各位大吓 小弟COM新手
------解决方案--------------------
你再看看智能指针是怎么做的,你就清楚了。
一般智能指针式通过它的析构函数来实现释放内存的。
spFun的生命周期是整个函数,可是函数结束之前调用了 ::CoUninitialize(),可是这时候spFun的生命还没有结束。这样就产生问题了。
------解决方案--------------------
调用此函数(::CoUninitialize())之后,便不能使用COM的函数了。
而析构函数仍然想用COM函数。
------解决方案--------------------
spFun.Release();
在该行下断点跟踪进去看看,就知道咋回事了
有一种理论是 不要使用全局的智能指针
问题如下:
比如我在app的InitInstance()中通过AfxOleInit()来初始化COM
是不是只要我没有使用全局的智能指针
这些智能指针在COM“析构”(是不是叫析构?)之前 都会自动释放 而不用我自己手动释放
然而 如果 我在一个函数中:
void keep()
{
::CoInitialize( NULL );
CComQIPtr < IFun, &IID_IFun > spFun;
//这句是必须的
spFun.Release();
::CoUninitialize();
}
如果像上面代码那样初始化COM 在COM “析构”之前 必须主动释放 智能指针
我不知道这是为什么???
::CoUninitialize();之后 发生什么了? 意思是 COM“析构”之后 spFun就不能用了? 还是什么意思
请教各位大吓 小弟COM新手
------解决方案--------------------
你再看看智能指针是怎么做的,你就清楚了。
一般智能指针式通过它的析构函数来实现释放内存的。
spFun的生命周期是整个函数,可是函数结束之前调用了 ::CoUninitialize(),可是这时候spFun的生命还没有结束。这样就产生问题了。
------解决方案--------------------
调用此函数(::CoUninitialize())之后,便不能使用COM的函数了。
而析构函数仍然想用COM函数。
------解决方案--------------------
spFun.Release();
在该行下断点跟踪进去看看,就知道咋回事了