代码测试之内存泄露

发表于:2011-12-21 10:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  在我们个人编程的过程当中,内存泄露虽然不会像内存溢出那样造成各种莫名奇妙的问题,但是它的危害也是不可忽视的。一方面,内存的泄露导致我们的软件在运行过程中占用了越来越多的内存,占有资源而又得不到及时清理,这会导致我们程序的效率越来越低;另一方面,它会影响我们用户的体验,失去市场的竞争能力。

  常见的内存泄露是这样的:

  • void process(int size)  
  • {  
  •     char* pData = (char*)malloc(size);  
  •   
  •     /* other code  */  
  •       
  •     return/* forget to free pData */  
  • }
  •   如上图所示,我们在函数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记录下一个内存节点。

      b)修改内存的分配函数

      对业务侧的malloc进行函数修改,添加下面一句宏语句

      #define malloc(param)  MemoryMalloc(__FUNCTION__, __LINE__, param)

      在桩函数侧书写下面的代码

  • void* MemoryMalloc(const char* name, int line, int size)  
  • {  
  •     void* pData = (void*)malloc(size);  
  •     MEMORY_NODE* pMemNode = NULL;  
  •     if(NULL == pData) return NULL;  
  •     memset((char*)pData, 0, size);  
  •   
  •     pMemNode = (MEMORY_NODE*)malloc(sizeof(MEMORY_NODE));  
  •     if(NULL == pMemNode){  
  •         free(pData);  
  •         return NULL;  
  •     }  
  •     memset((char*)pMemNode, 0, sizeof(MEMORY_NODE));  
  •     memmove(pMemNode->functionName, name, strlen(name));  
  •     pMemNode->line = line;  
  •     pMemNode->pAddress = pData;  
  •     pMemNode->next = NULL;  
  •     add_memory_node(pMemNode);  
  •   
  •     return pData;  
  • }
  • 21/212>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号