一、智能指针的概念

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

原理:智能指针封装了包含指针的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中moviepy调用ffmpeg的错误:subprocess, PermissionError: [WinError 5] 拒绝访问

    近期运行一个python程序用到了moviepy.editor.VideoFileClip() moviepy基于ffmpeg,但是并不是pip安装的ffmepg, 执行 import imageio ...

  2. Android ImageButton的使用。

    1.首先是范例代码,一个基本的ImageButton响应. package com.example.arlxsdemo; import android.graphics.Bitmap; import ...

  3. Educational Codeforces Round 1 (C) (atan2 + long double | 大数)

    这题只能呵呵了. 东搞西搞,折腾快一天,最后用了一个800多行的代码AC了. 好好的题目你卡这种精度干啥. 还有要卡您就多卡点行不,为什么long double 又可以过... 废了N长时间写个了不管 ...

  4. 自然常数e的神奇之美

  5. 【python】-- 类的多继承、经典类、新式类

    继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...

  6. Android中的资源访问

    Android中的资源是指非代码部分,指外部文件. assets中保存的一般是原生的文件,例如MP3文件,Android程序不能直接访问,必须通过AssetManager类以二进制流的形式来读取. r ...

  7. Android Dev Tips

    Ref:Android Service与Activity之间通信的几种方式 Ref:基础总结篇之五:BroadcastReceiver应用详解 Ref:Android Activity和Intent机 ...

  8. centOS-64位通过YUM源安装nginx

    第一步:在 /etc/yum.repos.d/ 目录下,建立名叫nginx.repo的软件源配置文件.        文件 nginx.repo 的内容是: [nginx] name=nginx re ...

  9. Python list,tuple,dict and set

    list 有序可变的集合 查找和插入的时间随着元素的增加而增加 占用空间小,浪费内存很少 tuple 有序只读不可变.因为tuple不可变,所以代码更安全.如果可能,能用tuple代替list就尽量用 ...

  10. c++学习笔记(网上资料)

                                    C++笔记       2007-3-22 1. 程序 —— 可执行文件,人发送给计算机的一组指令.         硬件指令是二进制, ...