一、智能指针的概念

智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放。

原理:智能指针封装了包含指针的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)的更多相关文章

  1. OSG中的智能指针

    在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...

  2. C++ 中的智能指针-基础

    简介 在现代 C++ 编程中,标准库包含了智能指针(Smart pointers). 智能指针用来确保程序不会出现内存和资源的泄漏,并且是"异常安全"(exception-safe ...

  3. RPCZ中的智能指针单例

    RPCZ中的智能指针单例 (金庆的专栏) 智能指针单例应用于 RPCZ 库以实现库的自动初始化与自动清理. RPCZ: RPC implementation for Protocol Buffers ...

  4. Boost中的智能指针(转)

    这篇文章主要介绍 boost中的智能指针的使用.(转自:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html) 内存管理是一 ...

  5. C++中的智能指针、轻量级指针、强弱指针学习笔记

    一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...

  6. 标准库中的智能指针shared_ptr

    智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...

  7. 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...

  8. 智能指针类模板(上)——STL中的智能指针

    智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...

  9. C++中的智能指针类模板

    1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...

随机推荐

  1. Android注解支持(Support Annotations) (转)

    原文地址:http://www.flysnow.org/2015/08/13/android-tech-docs-support-annotations.html 注解支持(Support Annot ...

  2. saltstack之用户管理

    1.添加用户 /srv/salt/top.sls base: 'test82.salt.cn': - user.useradd /srv/salt/user/useradd.sls jim: user ...

  3. 打造自己的LINQ Provider(上):Expression Tree揭秘

    概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞,如LINQ to NHiber ...

  4. linux授权某个用户对某个目录有读写的权限

    针对特定的某一个用户设置文件或目录权限,用setfacl. 首先打开文件系统的acl功能,在挂载参数添加cal,再保存退出,比如/home分区: vim /etc/fstab /dev/sda2 /h ...

  5. api签名认证

    参数列表: data: { sign, uid或是openId, version, timestamp, param } sign 签名一般情况下,根据如下几项生成,通过md5或是aes加密: 接口 ...

  6. Java中List.remove报UnsupportedOperationException异常

    今天项目中有个需求场景: A和B都是List,而B是A的子集,现在想求A和B的差集. 想到了List中提供的removeAll()方法可以求得差集,但是结果确报了UnsupportedOperatio ...

  7. openssl将私钥和crt证书合成pfx证书

    pfx是什么文件:公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥.公钥和证书指定了一个可移植的格式.它 ...

  8. 使用微软官方U盘制作软件来安装纯净版windows

    第一步:下载一个制作U启的工具;windows-usb-dvd-download-tool 微软官网:https://www.microsoft.com/en-us/download/windows- ...

  9. oracle decode 用法

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN ...

  10. mysql查询当天,本周,本月,上一个月的数据(转)

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...