内存泄露带来的问题我想我就不必多少了,检测内存泄露有很多种方法,比如使用一些智能指针。但本文介绍的方法有些不同,我们将自己维护一个数组列表,记录下 new 内存时代码所在的文件、行号、以及大小、和是否已经被 delete 信息,将这些信息放到我们维护的数组中,当程序要检查内存泄露或者程序退出时,我们遍历整个堆内存,并把每一个堆内存块在我们维护的数组中遍历,如果发现某些内存并没有被标记为 delete 状态,那么则判定为泄露。

Continue reading

AWE (Address Windows Extension) 可以使用开启 PAE 后普通应用程序无法使用到的内存,这部分内存系统可能无法识别,但通过 AWE 则可以完美访问。操作 AWE 内存的具体步骤如下,大部分内容来自北风网视频教程。

1、开窗 VirtualAlloc + MEM_PHYSICAL,明确告知系统,这段保留的空间未来将存放我自己申请的物理内存。
2、分配物理内存 AllocateUserPhysicalPages,按页面个数来分配,不是按字节分配的,最少一个页面 4K 的物理内存。
3、将申请好的物理内存映射到窗口中(相当于提交)MapUserPhysicalPages。
4、对已经提交的内存读写…
5、释放物理内存页面。

Continue reading

Windows 堆内存是性能仅次于虚拟内存的内存管理机制。它不像虚拟内存,每次分配至少是一个页面(4K),它可以灵活的只分配 1 个字节来使用,不浪费内存的空间。但你分配的内存必须由自己维护释放。下面演示了堆内存的使用方法。

Continue reading

大页面的的应用场景及注意事项如下(出自北风网 VC++ 系列视频教程,请到官网下载尊重版权):

  • 大页面的内存是不能换页的,只能常驻于RAM中,不会存在页面文件中 (即大页面不会换页,物理内存紧张时慎用)
  • 大页面的内存算作进程的私有页面,不会统计在进程工作集中
  • 因为大页面尺寸远大于小页面尺寸,分配一个大页面必须要有连续的足够大块的物理内存,这可能导致系统进行耗时的内存碎片整理工作
  • 大页面始终是可读写的,并且是充分利用了高速缓存(TLB)
  • 大页面的分配不受作业对象对进程工作集大小的限制
  • 在Intel安腾架构上的WOW64系统不支持32位应用大页面,除非重编译应用为64位的

Continue reading

虚拟内存一次保留(MEM_RESERVE 可以理解为申请)最小就是 64K,一次提交(MEM_COMMIT)至少是一个页面 4K。而往往有的时候我们不知道我们到底需要多少虚拟内存才够使用,所以可能需要动态分配,下面例子演示了如何使用结构化异常机制,动态根据需要分配内存给一个不断写入新字符的空间使用。例子来自 MSDN,我只是学习抄写了一份!

Continue reading

曾经在杭州一家公司做技术售后的时候,有一个印象深刻的问题,就是腾讯游戏《剑灵》在 Windows 32 位平台上报错的问题:http://support.icafe8.com/technologynews/hotfault/4708.html。综述原因就是在 32 位平台下虚拟内存地址空间不足(官方给的是这个答复,但真相到底是什么因为当时能力有限没有一探究竟)导致游戏申请不到更多的内存使用而崩溃。那么可以通过 /3GB 的手段去拓展用户空间的虚拟内存地址限制。但 Windows 只有一些参数的开关,我不知道开了以后到底这个进程可用的虚拟内存地址空间还有多少。最近在学习 Windows 内存管理时有人介绍了这款工具 VMMap。

Continue reading

在使用 MFC 框架编写代码时,总会遇到一个问题就是需要看一下 MFC 框架中某个函数是如何实现的,但当你 F12 跟踪到某个函数声明的时候,再继续跟踪你会发现无法继续跟踪下去了,因为函数实现的代码并不在工程项目管理范围内,IDE 不知道到哪去找这个函数的实现。以往的一些方法都是在 MFC 文件夹目录下直接搜索 类名::函数名 这种方式。不但繁琐,而且准确度不高。所以 Visual Assist 出场了。

Continue reading