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来管理指针。