COM智能指针(Smart Pointer)的陷阱

        最近在写一个MSXML4.0的包装类,针对自己的项目实现一些实用功能。
使用了COM的智能指针,发现使用智能指针有一些需注意的问题。
       智能指针的最大陷阱就是所谓的它能够自动销毁。
       我们知道,智能指针提供一种栈上对象管理堆上对象的方法,使用栈上
对象的生存周期去控制堆对象的生存周期,比如我们在某个大括号里声明了
一个CComPtr对象,当这个大括号结束时,它就自动调用Release,把自己释
放。

        既然说到COM的智能指针,那就不能不提CoInitialize(Ex)这个函数,它用
来初始化COM库,并把当前线程加入到一个Department中。每一个CoInitialize都应有
一个CoUninitialize与之对应的,这也带来了问题。
        我的类里有些函数需返回一个IXMLDOMNodePtr,于是我把它做成一个成员变
量,专门用来返回,免得每次都在函数内构造;可是程序运行结束时会有内存错误;
而在函数内构造一个IXMLDOMNodePtr并将它返回却没问题。经检查发现,是因为
我没有在我的析构函数里调用CoUninitialize,而是在另一个函数CloseDocument里调用
它,导致在类对象销毁之前就已经调用了CoUninitialize,所以此时无论显式还是隐式
(自动)调用Release,都会因为所有的COM资源都已经被回收而失败。故有以下忠告:
*********************************************************************
忠告:请保证所有的智能指针在调用CoUninitialize之前都已经被释放,必
                要的话手工显式释放之。
*********************************************************************

你可能感兴趣的:(COM智能指针(Smart Pointer)的陷阱)