Tekkaman

导航

 

内存管理是C++中永恒的话题, 磨刀不误砍柴功,先把内存管理这块给搞个透彻,有助于对ATL的整体理解和把握。

打开<atlalloc.h>,发现它只包含了两上头文件<windows.h>、<ol2.h>,显然<atlalloc.h>是ATL中少有的一个不依赖于任何ATL、MFC头文件的库文件。

因为<atlalloc.h>不依赖于任何其它同类库文件,所以对<atlalloc.h>的分析相比CString就容易了很多,不需要分析复杂的文件间关系。

那么,我们从文件的第一行开始,一点一点地分析<atlalloc.h>到底都干了什么。

atlalloc.h都干了什么

1、定义AtlLimits类,该类没有模板类的具体实现,只有偏特化的实现。

2、定义AtlAdd系列函数,该系统函数的特点是利用了条目1中定义的类,来实现安全(防溢出)的加与乘运算。

3、三个内存管理器CCRTAllocator、CLocalAllocator、CGlobalAllocator。(就win32来说,实际只有CCRTAllocator有用,后两个可无视)

4、基于字节管理的指针分配器和基于元素管理的分配器

5、定义CTempBuffer类,该类的功能是作为一个临时缓存,该类的实现先考虑在栈上分配内存,栈上空间不够时,就从堆中分配。(这招在实际开发中广泛使用)

6、_ATL_SAFE_ALLOCA_* 等安全内存管理服务

  1)安全内存管理类 CAtlSafeAllocBufferManager,所谓的安全,由该类实例分配的内存会被用链表记录起来,在类实例析构的时候内存会被保证释放。(利用析构的特性,智能指针也是一样)另外,该类实例只提供申请内存服务,不提供主动删除内存服务。

  2)安全服务操作宏,简单来说共两个,USES_ATL_SAFE_ALLOCA 和 _ATL_SAFE_ALLOCA。使用USES_ATL_SAFE_ALLOCA来打开安全内存分配服务,_ATL_SAFE_ALLOCA来实际分配内存。至于使用的原理,在开户开关时,实际上定义了一个CAtlSafeAllocBufferManager管理对象,在分配的时候,根据内存大小判定将内存分配在栈上还是堆上,栈上的内存由_alloc来分配,堆上的内存由CAtlSafeAllocBffferManager来分配。

  好了,至此<atlalloc.h>已经分析完了,我们再回头看看,发现这个头文件真是太简单了。对于上面的内存,我们再分一下大类,我们发现,前5项可以归为一类,提供统一的普通的内存管理;第6项可单独归为一类,提供安全的内存服务。

posted on 2011-04-23 20:26  Tekkaman  阅读(1740)  评论(0编辑  收藏  举报