返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 内存管理(1)] 分配和释放堆内…
 RTX 4060 显卡提升太小引玩家…
 远在天边近在眼前!GeForce …
 1080P升级首选!耕升 GeForc…
 停产的英特尔Arc A770有多香…
 爸爸给女儿买RTX4060Ti显卡当…
 500预算该选谁?650W电源同台…
 如何提高电脑性能?电脑性能…
 高效稳定之选 五款热门高功率…
 小白也能变大神:小编教你电…
 电源功率选“温饱”还是奔“…
 硬盘 蓝盘和绿盘都是什么意思
 硬盘是什么意思网络用语
 微机中硬盘是指什么
 硬盘中的Master和Slave是什么…
 电脑基础知识: 电脑三大件是…
 以技术创新赋能屏显产品三星…
 准大学生“攒”的第一台电脑…
 制造业项目建设专题报道安徽…
 落子“先手棋” 抢占“新高地…
 为什么手机内存比电脑还大?…
 【open car】六位帝皇烷
 cpu的作用是什么?cpu的主要…
 电脑cpu的种类介绍
 2024新疆吐鲁番市国考公告什…
 洞悉未来崭新一页尔英科技B7…
 合肥首个开始试运营!
 Acer宏碁新增合肥售后服务站
 移民澳大利亚后的三种真实生…
 转需!开锁、手机维修、加工…
 Acer宏碁合肥售后服务站迁址
 快消通路:现有渠道介绍
 网络渠道如何与传统渠道和谐…
 中国营销传播网
 传统渠道是主线 电话车险市场…
 传统渠道如何赋能产业互联网
 鼎镁科技主板IPO被否这些问题…
 “硬伤”明显、蓝筹成色不足…
 全面注册制下首见主板IPO被否…
 光弘科技:拟不超5000万元参…
 比电脑还大!一加Ace 2 Pro配…
 孕期查出宫腔积液到底需不需…
 容量比电脑还大!一加新机将…
 比电脑内存还大一加Ace2 Pro…
 【长测】破案了!是内存问题…
 摩尔线程发布“智娱摩方”游…
 40系显卡延期发布是怎么回事…
 RTX 4060是独立显卡吗 玩吃鸡…
 RTX 4070显卡功耗是多少 玩吃…
 最优惠模拟开箱子CSGO网站大…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
内存管理(1)] 分配和释放堆内存[TZZ]
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/7/9 21:52:39 | 【字体:

  立鲁欧洲杯246o大家好!今天我给大家介绍一下“通过Windows API函数,在调用进程的堆上分配和释放内存的方法”。微软的内存管理服务,为我们提供了一系列的进程堆管理函数。通过这些API函数,我们可以实现自己的内存管理功能,进而开发出效率更高的应用程序。如果您觉得这篇教程有帮助,请为我投上宝贵的一票(顺便求个关注),谢谢!

  在打开的“MemoryMgtDemo1.cpp”文件中,包含Windows.h头文件,然后添加“获取当前进程默认堆句柄”的测试代码。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,可以见到“获取应用程序默认堆成功”的字样,表示GetProcessHeap函数调用成功。每个进程都有一个默认的堆内存(对应的是物理内存,并非虚拟内存中的堆内存),对于32位程序而言,其最大大小只能到4GB,超过4GB的内存将无法寻址(一维数组地址的最大值只能到unsigned long(-1));

  结束控制台程序,返回到main函数中。继续添加“从默认堆上分配一块内存”的测试程序,然后调试运行程序,在弹出的控制台窗口中,可以见到分配内存成功的输出信息。在这份测试代码中,通过HeapAlloc函数从默认堆内存上分配了一块128字节的内存,然后判断该函数是否调用成功。HeapAlloc函数的第2个参数,可以设定堆内存的访问方式(默认是同步访问,加HEAP_NO_SERIALIZE则为非同步)、是否将分配的内存清0(HEAP_ZERO_MEMORY)以及是否在内存不够是抛系统异常(HEAP_GENERATE_EXCEPTIONS);

  结束控制台程序,返回到main函数中。继续添加“获取buffer1字节大小”的测试程序,然后调试运行。在弹出的控制台窗口中,可以见到获取到的buffer1大小与分配的大小一致。在调用HeapSize时,必须保证第1个参数为堆内存句柄,第3个参数为从堆内存上分配的内存块指针;

  结束控制台程序,返回到main函数中。继续添加“输出buffer1中所有字节”的测试代码。这份代码中,采用for循环遍历buffer1中的所有字节内存,每输出8个字节则额外输出一个回车,切换到下一行中继续输出。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,可以见到打印出的buffer1的内容,其中存放的值均为内存中的残留数据;

  结束控制台程序,返回到“MemoryMgtDemo1.cpp”文件中。在main函数之上,新增一个“tx_print_heap_memory”函数,专门用于以每行8个字节输出内存中的数据内容(多增加一个参数,则可以指定每行显示的字节数);

  tx_print_heap_memory函数编写完毕后,继续向main函数中增加“从默认堆上分配内存块并将内容清0,然后将内容输出”的测试代码。使用HeapAlloc分配内存时,只要将第2个参数中增加HEAP_ZERO_MEMORY标记即可。代码编写完毕后,调试运行程序。在弹出的控制台窗口中,你会发现新分配的buffer2的内容已经被全部清0了;

  结束控制台程序,返回到main函数中。这次试试通过HeapAlloc分配一个最大内存的测试程序。由于之前已经分配了2个128字节的内存,此时再分配最大空间,应该会妥妥的失败。测试代码编写完毕后,调试运行程序。在弹出的控制台窗口中,可以见到buffer3分配空间失败的打印信息;

  结束控制台程序,返回到main函数中。继续添加“让HeapAlloc分配空间失败抛系统异常”的测试代码。如果你跟我一样,认为HeapAlloc抛的异常可以被try…catch捕获到,那恐怕要令你失望了。测试代码编写完毕后,调试运行程序。随后,VS2017直接弹出了“未经处理的异常”提示框。由此可知,HeapAlloc函数抛出的异常类型,无法通过try...catch捕获。它属于系统级的,关于处理这种异常(比如:除0,访问非法内存等)的方法,请参考“结构化异常处理”;

  在VS2017中停止控制台程序,返回到main函数中。将HeapAlloc抛异常的测试代码全部注释掉,然后增加通过HeapFree函数释放buffer1和buffer2的代码。编写C++程序时,凡是在堆上分配的内存,均需要手动释放,否则会造成内存泄漏(更好的习惯是使用std::shared_ptr类管理分配的堆内存空间);

  至此,在堆上分配和释放内存的测试代码就介绍完毕了。如果您希望学到更多实用的编程知识,记得关注我哦!Enjoy!

  经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。

  写经验 有钱赚

  如要投诉,请到百度经验投诉中心,如要提出意见、建议, 请到百度经验管理吧反馈。

  ©2023Baidu京ICP证030173号-1 京网文【2023】1034-029号

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 内存管理(1)] 分配和释放堆内存[TZZ] (07-09)
    普通电脑内存 比电脑还大!一加Ace 2 Pro配置细节曝光:或首… (07-09)
    普通电脑内存 孕期查出宫腔积液到底需不需要治疗? (07-09)
    普通电脑内存 容量比电脑还大!一加新机将搭载24GB内存有必… (07-09)
    普通电脑内存 比电脑内存还大一加Ace2 Pro将搭载24GB内存 (07-09)
    普通电脑内存 【长测】破案了!是内存问题 但完美解决 (07-09)
    普通电脑内存 16GB大内存体验符合预期吗?一加Ace2V入手4个… (07-08)
    普通电脑内存 Redmi最强性能!K60 Ultra跑分出炉:天玑9200… (07-08)
    普通电脑内存 科学家研发 BBCube:速度是 HBM2M 内存 4 倍、… (07-08)
    普通电脑内存 骁龙8 Gen2+24GB内存满配直屏旗舰!线详细参数… (07-08)
    普通电脑内存 高带宽内存价格已开始上涨 预计未来两年供应仍… (07-08)
    普通电脑内存 中科院计算所推出多语言大模型“百聆”我们已… (07-08)
    普通电脑内存 墨西哥4月汽车销量中国品牌牛逼奇瑞刚杀进就打… (07-08)
    普通电脑内存 科大讯飞P20、P20Plus用后体验英语学习成绩提… (07-08)
    普通电脑内存 紧凑ATX中塔钢炮——几何未来 M4 装机展示 (07-08)
    普通电脑内存 行业前沿|阿里版 ChatGPT 突然官宣!我们用 … (07-08)
    普通电脑内存 内存对齐的规则以及作用 (07-07)
    普通电脑内存 贝迪BMP21 PLUS手持式英文标签打印机 (07-07)
    普通电脑内存 全球新消息丨怎么在bios里面设置内存频率 电脑… (07-07)
    普通电脑内存 性能媲美Z790还能支持DDR5 8000内存!高性价比… (07-07)