本帖最后由 伊海 于 2014-7-28 10:55 编辑
代码测试之内存泄露 在我们个人编程的过程当中,内存泄露虽然不会像内存溢出那样造成各种莫名奇妙的问题,但是它的危害也是不可忽视的。一方面,内存的泄露导致我们的软件在运行过程中占用了越来越多的内存,占有资源而又得不到及时清理,这会导致我们程序的效率越来越低;另一方面,它会影响我们用户的体验,失去市场的竞争能力。 常见的内存泄露是这样的:
如上图所示,我们在函数process的处理过程中,每一次都需要对内存进行申请,但是在函数结束的时候却没有进行释放。如果这样的一段代码出现在业务侧,那么后果是难以想象的。举个例子来说,如果我们服务器每秒钟需要接受100个用户的并发访问,每个用户过来的数据,我们都需要本地申请内存重新保存一份。处理结束之后,如果内存没有得到很好地释放,就会导致我们服务器可用的物理内存越来越少。一旦达到某一个临界点之后,操作系统不得不通过内外存的调度来满足我们申请新内存的需求,这在另一方面来讲又会降低服务器服务的质量。
内存泄露的危害是不言而喻的,但是查找内存泄露却是一件苦难而且复杂的工作。我们都知道,解决bug是一件非常简单的事情,但是寻找bug的出处却是一件非常吃力的事情。因此,我们有必要在自己编写代码的时候,就把查找内存泄露的工作放在很重要的位置上面。那么有没有什么办法来解决这一问题呢? 我想要做到解决内存泄露,必须做到下面两个方面: (1)必须记录内存在哪个函数申请的,具体文件的行数是多少 (2)内存应该什么时候被释放 要完成第1个条件其实并不困难。我们可以用节点的方法记录我们申请的内存: a)设置节点的数据结构 - typedef struct _MEMORY_NODE
- {
- char functionName[64];
- int line;
- void* pAddress;
- struct _MEMORY_NODE* next;
- }MEMORY_NODE;
复制代码
其中 functionName记录函数名称,line记录行数, pAddress记录分配的地址, next记录下一个内存节点。
|