内存泄露带来的问题我想我就不必多少了,检测内存泄露有很多种方法,比如使用一些智能指针。但本文介绍的方法有些不同,我们将自己维护一个数组列表,记录下 new 内存时代码所在的文件、行号、以及大小、和是否已经被 delete 信息,将这些信息放到我们维护的数组中,当程序要检查内存泄露或者程序退出时,我们遍历整个堆内存,并把每一个堆内存块在我们维护的数组中遍历,如果发现某些内存并没有被标记为 delete 状态,那么则判定为泄露。
AWE 内存管理
AWE (Address Windows Extension) 可以使用开启 PAE 后普通应用程序无法使用到的内存,这部分内存系统可能无法识别,但通过 AWE 则可以完美访问。操作 AWE 内存的具体步骤如下,大部分内容来自北风网视频教程。
1、开窗 VirtualAlloc + MEM_PHYSICAL,明确告知系统,这段保留的空间未来将存放我自己申请的物理内存。
2、分配物理内存 AllocateUserPhysicalPages,按页面个数来分配,不是按字节分配的,最少一个页面 4K 的物理内存。
3、将申请好的物理内存映射到窗口中(相当于提交)MapUserPhysicalPages。
4、对已经提交的内存读写…
5、释放物理内存页面。
Windows 堆内存管理
Windows 堆内存是性能仅次于虚拟内存的内存管理机制。它不像虚拟内存,每次分配至少是一个页面(4K),它可以灵活的只分配 1 个字节来使用,不浪费内存的空间。但你分配的内存必须由自己维护释放。下面演示了堆内存的使用方法。
Perl 文件操作
perl 语法的变态在下面的代码中体现更甚,一条没头没尾的正则,不知道的还以为是语法错误,实际它是可以正常执行的。
Perl 基础语法及数据结构
我也算学了基本脚本语言的人,Au3、Pyhon、PHP、JavaScript、Shell 都用过,但这个家伙是有点让我膛目,语法简直简练到不能再简练了。一下午的时间看了看他的基础语法和示例,做一下记录。
大页面申请及使用
大页面的的应用场景及注意事项如下(出自北风网 VC++ 系列视频教程,请到官网下载尊重版权):
- 大页面的内存是不能换页的,只能常驻于RAM中,不会存在页面文件中 (即大页面不会换页,物理内存紧张时慎用)
- 大页面的内存算作进程的私有页面,不会统计在进程工作集中
- 因为大页面尺寸远大于小页面尺寸,分配一个大页面必须要有连续的足够大块的物理内存,这可能导致系统进行耗时的内存碎片整理工作
- 大页面始终是可读写的,并且是充分利用了高速缓存(TLB)
- 大页面的分配不受作业对象对进程工作集大小的限制
- 在Intel安腾架构上的WOW64系统不支持32位应用大页面,除非重编译应用为64位的
利用结构化异常实现动态分配虚拟内存
虚拟内存一次保留(MEM_RESERVE 可以理解为申请)最小就是 64K,一次提交(MEM_COMMIT)至少是一个页面 4K。而往往有的时候我们不知道我们到底需要多少虚拟内存才够使用,所以可能需要动态分配,下面例子演示了如何使用结构化异常机制,动态根据需要分配内存给一个不断写入新字符的空间使用。例子来自 MSDN,我只是学习抄写了一份!
Windows 虚拟内存查看工具 VMMap
曾经在杭州一家公司做技术售后的时候,有一个印象深刻的问题,就是腾讯游戏《剑灵》在 Windows 32 位平台上报错的问题:http://support.icafe8.com/technologynews/hotfault/4708.html。综述原因就是在 32 位平台下虚拟内存地址空间不足(官方给的是这个答复,但真相到底是什么因为当时能力有限没有一探究竟)导致游戏申请不到更多的内存使用而崩溃。那么可以通过 /3GB 的手段去拓展用户空间的虚拟内存地址限制。但 Windows 只有一些参数的开关,我不知道开了以后到底这个进程可用的虚拟内存地址空间还有多少。最近在学习 Windows 内存管理时有人介绍了这款工具 VMMap。
Visual Assist 快速查找 MFC 函数实现
在使用 MFC 框架编写代码时,总会遇到一个问题就是需要看一下 MFC 框架中某个函数是如何实现的,但当你 F12 跟踪到某个函数声明的时候,再继续跟踪你会发现无法继续跟踪下去了,因为函数实现的代码并不在工程项目管理范围内,IDE 不知道到哪去找这个函数的实现。以往的一些方法都是在 MFC 文件夹目录下直接搜索 类名::函数名
这种方式。不但繁琐,而且准确度不高。所以 Visual Assist 出场了。
Windows 内核获取开机所用时间及当前系统时间
获取开机时间并不像应用层简单的调用一个 API 就搞定了,在内核需要 GetTickCount
获取一个滴答数,然后把这个滴答数转为毫秒,再进行运算即可得出开的时间。以下是获取开机多少分钟和当前系统时间的结果,代码在下方:
tick count = 2 minutes.
time = 2016-04-01 00:39:26