一、智能指针的概念

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

原理:智能指针封装了包含指针的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. Python修饰器的函数式编程(转)

    From:http://coolshell.cn/articles/11265.html 作者:陈皓 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desi ...

  2. 如何使CSS--better(系列一)

    我们想一下以下问题: 1.什么样子的css代码才是高效的? 2.什么样子的css代码才是便于维护的? 3.什么样子的css才是可扩展的? 带着以下问题咱们简单的说一下css的“性能”问题 虽然我技术不 ...

  3. Java中线程和线程池

    Java中开启多线程的三种方式 1.通过继承Thread实现 public class ThreadDemo extends Thread{ public void run(){ System.out ...

  4. elasticsearch从入门到出门-01windows上安装使用

    elasticsearch 1.安装JDK,至少1.8.0_73以上版本,java -version2.下载和解压缩Elasticsearch安装包,目录结构3.启动Elasticsearch:bin ...

  5. 智能家居DIY-空气质量检测篇-获取空气污染指数

    前言 话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一直没有时间搞,最近终于闲下来了这个事情终于提上议程了,现 ...

  6. api 爬虫 避免相同 input 在信息未更新 情况下 重复请求重复

  7. ASP跳出FOR循环

    由于ASP不能使用GOTO语句,我在FOR循环中加入一个FOR循环,若需要跳出,即退出最里面那个FOR循环. DEMO: <%dim aa = 0for i = 1 to 10    for j ...

  8. Android笔记之WebView加载网页的进度回调

    wv.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, i ...

  9. Linux c编程:线程属性

    前面介绍了pthread_create函数,并且当时的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针.可以使用pthread_attr_t结构修改线程默认属性,并把这些 ...

  10. IOS - 执行时 (多态)

    一 多态概述          多态指同一操作作用于不同的对象.能够有不同的解释.产生不同的执行结果.它是面向对象程序设计(OOP)的一个重要特征,动态类型能使程序直到执行时才确定对象的所属类.其详细 ...