内存泄露对策与调试

1、基本用法

malloc/free与new/delete区别
区别:delete/new涵盖了malloc/free的过程,C程序只能用malloc/free管理动态内存
用法:
int *p1 = (int *)malloc(sizeof(int) * length);//* malloc返回值的类型是void *,所以在调用malloc时要显式地进行//类型转换,将void * 转换成所需要的指针类型。
int *p2 = new int[length];
结论:尽量用new/delete

2、避免内存泄露的对策
1、在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行
2、如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
3、无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。
4、使用free或delete释放了内存后,将指针设置为NULL。防止产生“野指针”。
5、如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。此时应该用exit(1) 把坏程序杀死,否则可能会害死操作系统。

3、检测vc++中的内存泄露的方法

利用Debugview软件检测数据情况:
Debugview报告说明:
 
  1. [4092] Detected memory leaks!  
  2. [4092] Dumping objects ->  
  3. [4092] strcore.cpp(118) :   
  4. [4092] {73}   
  5. [4092] normal block at 0x00F64950, 21 bytes long.  
  6. [4092] Data: <            8.35> 01 00 00 00 08 00 00 00 08 00 00 00 38 2E 33 35  
  7. 。。。  
  8. [4092] Object dump complete. 
 
说明1:normal block
内存泄漏报告中把每一块泄漏的内存分为普通块、客户块和CRT块。事实上,你只需要留心普通块和客户块类型。
 

普通块(normal block):是由你的程序分配的内存。
客户块(client block):
是一种特殊的内存块,它是由MFC使用的一个对象,程序退出时,该对象的析构函数没有被调用。MFC new操作符可以用来创建普通块和客户块。
CRT块(CRT block):是由C RunTime Library供自己使用而分配的内存块。CRT库自己来管理这些内存的分配与释放,通常你不会在内存泄漏报告中发现有CRT内存泄漏,除非程序发生了严重的错误(例如CRT库崩溃)。

下面这两种类型的内存块不会出现在内存泄漏报告中:
空闲块(free block):已经被释放(free)的内存块。
忽略块(Ignore block):是程序员显式声明过不要在内存泄漏报告中出现的内存块。
 
说明2 :(118)
第118行出错
 
说明3:{73}
"73"是内存分配号,意思是泄漏的内存是你程序中分配的第十八个内存块:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章