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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值