GlobalAlloc()是16位WINDOWS程序使用的API,返回一个内存句柄,在实际需要使用时,用GlobalLock()来实际得到内存区。但,32位WINDOWS系统中,应使用新的内存分配函数HeapAlloc()以得到更好的支持,GlobalAlloc()还可以用,主要是为了兼容。

// TODO: 在此添加控件通知处理程序代码

/*
    GlobalAlloc申请的内存分两种,一种是GMEM_FIXED,另一种是GMEM_MOVEABLE。两者的差别只要在于GMEM_MOVEABLE类型的内存操作系统是可以移动的,比如堆中有好几块小内存,
    当再申请一大块内存时,操作系统会移动GMEM_MOVEABLE类型的内存来合并出一大块。正因为GMEM_MOVEABLE是可移动的,所以要用句柄标识,不能用内存地址标识,
    在使用时通过GlobalLock由句柄得到内存地址。对于GMEM_FIXED类型的,该函数返回的句柄就是内存指针,可以直接当内存指针使用
    GMEM_FIXED       分配一个固定内存块
    GMEM_MOVEABLE    分配一个可移动内存块
    GMEM_DISCARDABLE 分配一个可丢弃内存块
    GMEM_NOCOMPACT   堆在这个函数调用期间不进行累积
    GMEM_NODISCARD   函数调用期间不丢弃任何内存块
    GMEM_ZEROINIT    新分配的内存块全部初始化成零
    */
    HGLOBAL gMem=GlobalAlloc(0,1024);
    if (gMem==NULL)
    {
        AfxMessageBox(_T("GlobalAlloc"));
        return;
    }
    int gMemSize=GlobalSize(gMem);
    if (0==gMemSize)
    {
        AfxMessageBox(_T("GlobalSize"));
        return;
    }

/*GlobalLock:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。
    一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,
    这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,
    这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。
    */
    DWORD *pGlobalLockAddr;
    pGlobalLockAddr=(DWORD*)GlobalLock(gMem);
    if (pGlobalLockAddr==NULL)
    {
        AfxMessageBox(_T("GlobalLock"));
        return;
    }
    BOOL bGlobalUnlock=GlobalUnlock(gMem);
    if (!bGlobalUnlock)
    {
        AfxMessageBox(_T("GlobalUnlock"));
        return;
    }
    HGLOBAL gNewMem=GlobalReAlloc(gMem,2048,GMEM_ZEROINIT);

if (gMem!=NULL)
    {
        if (!GlobalFree(gMem))
        {
            AfxMessageBox(_T("GlobalFree"));
        }
    }
    if (gNewMem!=NULL)
    {
        if (!GlobalFree(gNewMem))
        {
            AfxMessageBox(_T("GlobalFree"));
        }
    }

GlobalAlloc全局内存的使用相关推荐

  1. LOCALALLOC和GLOBALLOC有什么区别? 全局内存和局部内存有什么区别?(转)

    在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据 ...

  2. 全局内存BSS,DATA,RODATA的区别以及其他内存区间相关

    刚接触c语言的时候,了解了全局变量这个概念,只知道所谓全局变量的意思就是代码文件里面所有的函数都可以随时调用修改的变量,而其实这种理解是十分不准确的,但随着后期学习的深入,接触了计算机组成原理和汇编的 ...

  3. CUDA C编程权威指南 第四章 全局内存

    基础 一般内存的设计:寄存器->缓存->主存->磁盘存储器 GPU内存设计 修饰符 变量名 存储器 作用域 生命周期 float var 寄存器 线程 线程 float var[10 ...

  4. gpu显存(全局内存)在使用时数据对齐的问题

    全局存储器,即普通的显存,整个网格中的任意线程都能读写全局存储器的任意位置. 存取延时为400-600 clock cycles  非常容易成为性能瓶颈. 访问显存时,读取和存储必须对齐,宽度为4By ...

  5. CUDA C 编程权威指南 Grossman 第4章 全局内存

    4.1 CUDA内存模型概述 内存访问和管理是所有编程语言的重要部分. 因为多数工作负载被加载和存储数据的速度所限制,所以有大量低延迟.高带宽的内存对性能是十分有利的. 大容量.低延迟的内存造价高且不 ...

  6. adreno源码系列(九)全局内存申请

    1. kgsl_allocate_global struct kgsl_memdesc *kgsl_allocate_global(struct kgsl_device *device,u64 siz ...

  7. 你的变量究竟存储在什么地方 全局内存

    我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个变量存储在什么地方,在内存中是如何存储的等等一系列问题.不仅仅是在面试中,学校里面的考试也会碰到同样的问题.  如果你还不 ...

  8. nginx全局内存缓存

  9. mysql 线程缓存_浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_s ...

最新文章

  1. AI复活「她」!用GPT-3复刻逝去未婚妻,美国小哥让挚爱以数字形态永生
  2. 请用状态转换图描述一个绘制折线的对话过程_CAD画一个元器件电路符号(AD)...
  3. 8.3 算法流程与评估-机器学习笔记-斯坦福吴恩达教授
  4. 用 PS 调整服务器时间
  5. routersploit简单实例
  6. python分析犯罪数据_使用 SparkSQL 分析纽约市犯罪数据
  7. 检测php常量是否存在,php判断变量常量是否存在
  8. BZOJ3238:[AHOI2013]差异——题解
  9. 新格尔软件测试大师,新格尔神雕软件
  10. php数组的用法,PHP array_udiff_uassoc() 函数
  11. git PHP commit 规范,git commit 时自动对所有 php 文件执行语法错误检查
  12. java使用Post方式发送https请求的方法,直接可以用
  13. 女人为什么必须学习会家庭财富管理?
  14. 奇安信代码安全实验室帮助谷歌修复高危漏洞,获官方致谢
  15. centos7 80端口被占用导致nginx或httpd无法启用的解决方法
  16. Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
  17. PS在园林计算机辅助设计中有哪些应用,计算机辅助设计在园林设计中的运用
  18. 西方世界的劫难Ⅳ:真神的国度--十大支线攻略
  19. STEAM游戏高主频i9-12900k 搭建CS:GO服务器
  20. 昂首阔步 从BC编译器走向VC编译器

热门文章

  1. 数据库-优化-pt-query-digest安装
  2. 实现runable接口创建线程
  3. 计算机设备抽象,计算机系统原理(三) 金字塔形的存储设备、操作系统的抽象概念...
  4. mysql5.58_mysql5.58编译安装手记
  5. YAML基础知识及搭建一台简洁版guestbook
  6. InstallShield Build Error -1014: Cannot rename directory PATH to PATH\folder.Bak.
  7. Hadoop学习:Map/Reduce初探与小Demo实现
  8. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 执行配置
  9. Python 中的模块和包
  10. EBS模块介绍和概念解释