C++ _com_ptr_t类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majalis_C/article/details/89064818

C++没有类似Java的内存回收机制,每执行一次new,就要手动delete。但是这容易产生很多问题。例如:

string* str=new string("...");

something.....//如果此处的代码出现了异常,导致程序终止。那么delete str便不会被执行。导致内存泄漏。

delete str;

如上例所示,实际编程种有很多种情况容易导致内存泄漏,这种情况并不少见。

可避免此问题的一种方法是使用智能指针。

本文主要介绍 _com_ptr_t 的使用。其实我们看名称就可猜出一二,这是一个模板类,其对象封装COM接口指针。

COM调用,需要手动AddRef,手动Release,大量的对象调用就要重复地执行AddRef,Release操作,容易出问题,写多了还烦人。

_com_ptr_t 是vc运行库中提供的固有的封装COM接口的智能指针,此模板类通过自动调用IUnknown成员函数: QueryInterface, AddRef,和Release来管理资源分配和解除分配。

说到封装COM接口指针的类,还有一个,是ATL种的CComPtr和CComQIPtr,此二者都是模板类,皆用来封装管理COM接口指针。笔者是C++小白,在这里吃了许多亏,一开始懵懵懂懂,稀里糊涂地就在自己的程序中用了CComPtr,后来发现无法在创建CComPtr对象中互相赋值,找到官方文档才知道,如果不是ATL工程,需要用_com_ptr_t而不是CComPtr来管理指针。写此文的时候,本想找到当初看的文档,补充一些其他的知识,再找文档却发现找不到了。。。此处为自己提一个醒,也告诫看到此文的童鞋朋友,遇到问题找到解决方式的时候,一定要及时记下来,否则将来做总结的时候会丢失一些宝贵的资料。

_com_ptr_t 是通过 _COM_SMARTPTR_TYPEDEF 宏来引用的。举个例子,

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));

这里稍微解释一下上述两个参数,第一个参数是接口名称,第二个参数是接口所对应的GUID。__uidof(expresion)可返回同expresion相关连的GUID。GUID可以标识接口,和其他东东,比如类对象。此处不研究。

 _COM_SMARTPTR_TYPEDEF 宏定义一个描述特定接口的指针,比如上述例子就描述了IMyInterface的智能指针,在其后加后缀Ptr,就可以定义该接口对应的指针变量了。

再举个例子,想要声明一个IMInterface的指针变量,需要以如下所示的形式。

IMyInterfacePtr myInterface;

此后,就可以愉快地使用你的智能指针了。

相关链接:https://docs.microsoft.com/zh-cn/cpp/cpp/com-ptr-t-class?view=vs-2019

https://blog.csdn.net/SYP35/article/details/50663022,这个博客介绍的很好,挂上来做个记录。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

话说写了几篇博客,深感笔力尚微,还需锻炼。写作技能果然很重要。。。。。

猜你喜欢

转载自blog.csdn.net/majalis_C/article/details/89064818