一、
内存错误:当一个指针或者该指针所指向的内存单元成为无效单元,或者内存中分配的数据结构被破坏时,就会造成内存错误。常见的内存错误:
1)指针或内存未被初始化
2)内存分配未成功,却使用了它
3)内存分配成功并且初始化,但操作越过了内存的边界;例如数组的边界
4)释放了内存却被继续使用:某个对象被释放却被继续使用;函数的return语句指向栈内存的指针或者引用;使用free或delete释放内存没有将指针设置为NULL值
5)删除未被初始化的指针、删除非堆指针、多次删除同一指针或者覆盖一个指针的内部数据结构
出现内存不能读写的提示信息:则可能是应用程序没有检查内存分配失败;或者是程序试图读写的内存被无疑中释放了或者由于某些操作变成为无效了
二、内存泄漏
内存泄漏在被动态分配的内存没有被释放时产生。有许多情况会导致内存泄漏,如没有在程序的全部执行路径中释放内存,没有在析构函数中释放所有的内存等。忘记释放内存;构造函数失败;存在内存泄漏的析构函数;存在内存泄漏的异常处理程序;如文件、窗口、设备上下文、GDI对象使用完未释放;多个返回语句;使用错误形式的delete。一个程序在崩溃之前可运行的时间越长,则导致崩溃的原因与内存泄漏的关系越大。
三、
在调试版本里,堆里未被初始化的内存被0xCD字节模式填充,堆里释放的内存被0xDD字节模式填充。堆栈里被初始化的内存被0xCC字节模式填充。调试版本和发布版本里,未被初始化的全局内存都被初始化为0。
四、
以发生的方式来分类,内存泄漏可以分为4类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,但是因为这个类是一个Singleton,所以内存泄漏只会发生一次
五、
作为黑盒测试,则WINDOWS NT 自带的Performance Monitor不失一个有效的内存泄露工具,Performance Monitor 加入了系统监视功能:比如CPU的使用率,内存的使用情况,I/O操作的频繁度等都作为一个个Counter,应用程序可以通过读取这些Counter了解整个系统的或者某个进程的运行状况。
我们一般可以监视Process对象的Handle Count,Virutal Bytes 和Working Set三个Counter。
Handle Count记录了进程当前打开的HANDLE的个数,监视这个Counter有助于我们发现程序是否有Handle泄漏;
Virtual Bytes记录了该进程当前在虚地址空间上使用的虚拟内存的大小,NT的内存分配采用了两步走的方法,首先,在虚地址空间上保留一段空间,这时并没有分配物理内存,只是保留了一段地址。然后,再提交这段空间,这时操作系统才会分配物理内存。所以,Virtual Bytes一般总大于程序的Working Set。
如果程序存在内存的泄漏这个值会持续增加,但是Virtual Bytes却是跳跃式增加的。
WINDOWS NT 自带的Performance Monitor的打开方式为 任务管理器-〉查看菜单->选择列表,就可以添加需要监控的计数器
六、.winrunner 工具在内存检测中的使用