关于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(); 
在该行下断点跟踪进去看看,就知道咋回事了