技术开发 频道

内存泄漏检查

  下面就来实现内存泄漏的检查。内存泄漏检查只需要在程序退出时检查哪些内存的引用计数不为0,只要对哈希表做一个遍历操作就可以获取哪些内存的引用计数不为0,编码如下。

  /** 垃圾内存收集算法的内存泄漏检查函数

  @return void——无

  */

  voidGC_CheckMemoryLeak()

  {

  void*p;

  HashTable_EnumBegin(g_pTable);

  while((p=HashTable_EnumNext(g_pTable))!=NULL)

  {

  INT*pRef;

  INT*pSize;

  INT*pLine;

  char*pszFile;

  pRef=(INT*)p;

  pSize=pRef+1;

  if(*pRef !=0) /*判断引用计数是否为0*/

  {

  pLine=(INT*)((char*)p+*pSize+DOUBLE_INT_LEN);

  pszFile=(char*)pLine+INT_LEN;

  printf("File:%s,Line:%dhavememoryleak.\n",pszFile,*pLine);

  }

  }

  }

  注意:程序中使用了printf()函数将文件名和行号打印出来,这里使用printf()函数只是做一个示意,实际应用中可能需要改成其他类型的信息输出函数。

  可以使用函数调用来实现在程序退出时自动调用GC_CheckMemory()函数。

  atexit(GC_CheckMemoryLeak);

  这里使用了C标准库的atexit()函数,这个函数是在整个程序退出时调用它的参数指向的函数来执行,但是调用的时间比全局变量的释放要早,所以如果使用了全局变量,全局变量也被当作泄漏报告出来。

0
相关文章