ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

Posted on 2018-04-28 19:18  moisiet  阅读(417)  评论(0编辑  收藏  举报

一、智能指针的概念

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

原理:智能指针封装了包含指针的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