zoukankan      html  css  js  c++  java
  • 完全解析<atlalloc.h>

    内存管理是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项可单独归为一类,提供安全的内存服务。

  • 相关阅读:
    交换机、集线器、路由器区别(转)
    64位RHEL5系统上运行yum出现"This system is not registered with RHN”的解决方法
    war包和jar包的区别【转】
    jQuery选择器
    jQuery中"$"的理解
    Eclipse maven项目中使用mybatis逆向工程
    Maven下出现Cannot change version of project facet Dynamic Web module to 2.5.
    Eclipse Maven项目出现“The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path”
    @ResponseBody的理解【转】
    Mybatis Generator最完整配置详解
  • 原文地址:https://www.cnblogs.com/tekkaman/p/2025848.html
Copyright © 2011-2022 走看看