文档库 最新最全的文档下载
当前位置:文档库 › 内存相关知识

内存相关知识

以C语言为例说明内存相关的注意事项:
(PS:C语言的内存管理机制不如Java完善,Java有垃圾内存自动回收机制,而C语言需要人为考虑的情况要多一些。)
1、用malloc或new申请内存后,应该立即检查指针值是否为NULL,防止使用指针值为NULL的值。
2、动态内存的申请与释放必须配对,以防止内在泄漏。
3、用free或delete释放内存之后,立即将指针设置为NULL,防止产生“野指针”。
4、不要忘记为数组和动态内存赋初值。
5、避免数组或指针的下标越界,特别要当心发生“多1”或“少1”操作。
==================
内存存储
内存当中是分区存储的,将内存分成多个逻辑存储区域,从高地址到低地址分别为:
栈:存储动态局部变量
堆:动态分配的内存空间(手动分配)
静态存储区:存储静态局部变量和全局变量,即在整个程序运行期间不变的量。
代码段:存储执行语句。
--
内存分配
C/C++/Java的内存分配方式是相同的,共有三种内存分配形式
1、从静态存储区域分配。内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量、Static变量。
2、在栈上分配。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3、从堆上分配,亦称动态内存分配。程序在运行时用malloc(C语言中)或new(C++、Java中)申请任意大小的内存,程序员自己负责在何时用free(C语言中)或delete(C++、Java中)释放内存。
总结:堆上分配的内存系统不释放,是动态分配的。栈上分配的内存系统会自动释放,它是静态分配的。
动态内存分配最容易产生内存问题,应该是测试的重点。
==========================
内存测试工具
BoundsChecker是美国康博软件公司(Compuware)生产的一款白盒测试工具,主要用来测试与内存相关的问题,如内存泄漏、内存溢出及指针操作等问题。
BoundsChecker支持的语言:C/C++,Delphi;支持的操作系统:Windows95/98/NT/2000/XP,不能跨平台。
能检测的错误:
1)指针操作和内存、资源泄漏错误。如内存泄漏(memory leak);资源泄漏(resource leak);对指针变量的误操作。
2)内存操作方面的错误。比如:内存读、写溢出(memory read/write overflow);使用未初始化的内存。
3)API函数的兼容性。检查常见API函数的兼容性,观察其在不同操作系统中的运行情况。
常用使用方法:
BoundsChecker安装后会自动集成在VC里。
有以下两种测试的模式:1
1、ActiveCheck模式:也叫低级模式,可以检查内存泄漏错误、资源泄漏错误及API函数使用错误。
2、FinalCheck:

也叫高级模式,检查指针操作错误、内存操作溢出、使用未初始化的内存等。
---
从严格意义上说,BoundsChecker不能算是标准和白盒测试工具,标准的白盒测试工具应具备编码检查、自动生成用例、动态测试等功能,而BoundsChecker只能对与内存相关的问题进行检测。
===========
内存泄漏问题可以通过黑盒、白盒测试两种方法检测,白盒测试方法就是借助测试工具(如BoundsChecker)对源代码进行检验,黑盒测试方法就是让程序连续运行一段时间(如72小时或是一周)来检验。

相关文档