ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)
一、智能指针的概念
智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放。
原理:智能指针封装了包含指针的AddRef()函数和Release()函数,且在该类不被需要的时候在析构函数里调用包含指针的Release()函数释放包含指针的资源。因此实质是利用类的析构达到调用包含指针的Release()函数的目的。
二、VC++中的智能指针:_com_ptr_t
_com_ptr_t实质是一个类模板。使用它时需要提供三个参数:接口的名称,接口的IID和实现类的CLSID。(其实和使用CoCreateInstance需要的参数差不多)
1.步骤:
1.定义一个智能指针:_COM_SMATRTPTR_TYPEDEF(IMyInterface,__uuidof(IMyInterface));
参数1:被包含的接口的名称;
参数2:被包含的接口的GUID值。
上面这个宏会自动为我们生成一个叫IMyInterfacePtr的智能指针(是个类),有了这个类,我们就可以定义类对象调用接口内的函数了。
2.定义一个智能指针对象:
IMyInterfacePtr pMyInterface;
3.实例化实现该接口的类。
方法一:pMyInterface.CreateInterface(__uuidof(MyInterface));//假设MyInterface是实现了IMyInterface接口的类。
方法二:pMyInterface(__uuidof(MyInterface));//因为智能指针构造函数里会自动调用CreateInstance()函数,所以直接提供实现类的guid即可。
4.调用接口的指针。
pMyInterface->show();
注意:智能指针析构的时候会自动调用接口的Release()函数,实现类MyInterface资源的释放,因此不用再调用Release()了,如果不放心,也可以调用。
即pMyInterface.Release();//注意中间是点操作符号,不是->操作符号。
2.为何智能指针又可以用.操作符,又可以用->操作符:
用.操作符是智能指针类调用自己的方法,用->操作符是调用包含接口的方法,因为智能指针类有个变量m_pInterface用来存储包含的接口,实质是pWisePtr.m_pInterface->method()。
智能指针的优点:
1.我们在调用CreateInstance()生成接口实现类对象时候,会自动调用智能指针一个_Release()的私有函数,使得之前的接口无条件被释放(引用数减1)。
2.智能指针内保存了一个m_pInterface的Interface*类型的指针,用于存储所包含的接口的指针。指针指针调用接口函数,实质就是该变量调用的结果。
三、我们只要知道怎么用
1.智能指针不用释放,当程序不需要的时候智能指针自动析构,析构中自动将所包含接口的引用数减少1;
2.通过宏_COM_SMATRTPTR_TYPEDEF(IMyInterface,__uuidof(IMyInterface))创建智能指针;
3.ADO、WORD、EXCEL等程序提供的都是智能指针,别在迷糊了。
参考文献:
1.https://www.cnblogs.com/coderlee/archive/2008/02/18/1071755.html
2.https://blog.csdn.net/liuzhi1218/article/details/5996969
ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)的更多相关文章
- OSG中的智能指针
在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...
- C++ 中的智能指针-基础
简介 在现代 C++ 编程中,标准库包含了智能指针(Smart pointers). 智能指针用来确保程序不会出现内存和资源的泄漏,并且是"异常安全"(exception-safe ...
- RPCZ中的智能指针单例
RPCZ中的智能指针单例 (金庆的专栏) 智能指针单例应用于 RPCZ 库以实现库的自动初始化与自动清理. RPCZ: RPC implementation for Protocol Buffers ...
- Boost中的智能指针(转)
这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一 ...
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
- 智能指针类模板(中)——Qt中的智能指针
Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...
- 智能指针类模板(上)——STL中的智能指针
智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...
- C++中的智能指针类模板
1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
随机推荐
- urllib库利用cookie实现模拟登录慕课网
思路 1.首先在网页中使用账户和密码名登录慕课网 2.其次再分析请求头,如下图所示,获取到请求URL,并提取出cookie信息,保存到本地 3.最后在代码中构造请求头,使用urllib.request ...
- LR报错 No buffer space available Try changing the registry value 端口号不够用了
报错:Action.c(6): Error -27796: Failed to connect to server "10.16.137.8:10035": [10055] No ...
- MySQL的max()函数使用时遇到的小问题
通常我们获取某个表的某个字段最大值时可以使用max()函数. 使用场景举例: 获取某个表id的最大值:SQL: SELECT max(id) FROM table_name; SELECT max(` ...
- python 基础 9.4 游标
一. 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果. 用户可以用SQL 语句逐一从游标中获取记录,并赋值给主变量,交由python 进一步处理,一组主变量一次只能存放一条 ...
- 序列DP(输出有要求)
DP Time Limit:10000MS Memory Limit:165888KB 64bit IO Format:%lld & %llu Submit Status De ...
- EasyNVR无插件直播服务器软件使用详情功能 - 录像功能说明
背景介绍 EasyNVR不仅仅拥有无插件的直播功能,更拥有对于直播录像的存储和日期检索功能: 本篇博文主要用于介绍EasyNVR的录像功能. 之前有博文介绍相关的录像功能,本篇主要为了介绍录像的新功能 ...
- EasyDSS流媒体解决方案实现的RTMP/HLS视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)
上一篇博文介绍了EasyDSS点播功能,然后作为RTMP流媒体服务器,接受RTMP推流.进行实时的直播流分发又是自身一大核心功能. 需求背景: 写本篇博文的一个目的是向大家介绍一下EasyDSS新版的 ...
- Python菜鸟之路:Python基础(三)
一.编码 推荐阅读<字符编码的前世今生>:http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201307/ ...
- hibernate多对多关系配置
一.创建用户,角色实体类. 一名用户可以有多个角色.一个角色可以对于多名用户. 用户实体类 public class User { private int uId; private String uN ...
- spring+hibernate+springmvc整合框架搭建
搭建maven web项目这里不再讲述,详情请查看http://www.cnblogs.com/wql025/p/5215570.html 现在讲述项目的搭建过程. 1.通过maven导入项目所用的j ...