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,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
随机推荐
- JVM调优- jstat(转)
jstat的用法 用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序. Jstat ...
- parse arguments in bash
There are lots of ways to parse arguments in sh. Getopt is good. Here's a simple script that parses ...
- linux卸载一个源码包安装的软件的流程
完全卸载memcached的方法(CentOS) 我的大内存vps(centos系统)曾经安装过memcached,想给论坛提速,实际上不但没有明显效果,反倒耗费内存,看着碍眼,于是想卸载,于是网上各 ...
- 设置tableView背景颜色
[treeTableView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight] ...
- asp.net mvc 反射应用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- how to add them, how to multiply them
http://www.physics.miami.edu/~nearing/mathmethods/operators.pdf
- 华为机试ACM(字符组合问题)
今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...
- vs+opencv
vs + opencv 配置见网页 https://blog.csdn.net/qq_17550379/article/details/78201442 统一所有工程配置见下图:
- 机器学习Coursera学习总结
Coursera上Andrew NG的机器学习实在是太火了,最近有时间花费了20来天的时间(每天3小时左右)终于学习完了全部的课程,总结如下: (1)适合入门,讲的比较基础,Andrew讲的很棒: ( ...
- STM32 ~ 串口DMA通道查找
STM32F4XX: /**************************************************************************************** ...