一、基本用法c++
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程序员
二、避免内存泄露的对策
一、在使用内存以前检查指针是否为NULL。若是指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行
二、若是是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
三、不管用何种方式建立数组,都别忘了赋初值,即使是赋零值也不可省略,不要嫌麻烦。
四、使用free或delete释放了内存后,将指针设置为NULL。防止产生“野指针”。
五、若是在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。此时应该用exit(1) 把坏程序杀死,不然可能会害死操做系统。sql
三、检测vc++中的内存泄露的方法数组
- [4092] Detected memory leaks!
- [4092] Dumping objects ->
- [4092] strcore.cpp(118) :
- [4092] {73}
- [4092] normal block at 0x00F64950, 21 bytes long.
- [4092] Data: < 8.35> 01 00 00 00 08 00 00 00 08 00 00 00 38 2E 33 35
- 。。。
- [4092] Object dump complete.
普通块(normal block):是由你的程序分配的内存。
客户块(client block):是一种特殊的内存块,它是由MFC使用的一个对象,程序退出时,该对象的析构函数没有被调用。MFC new操做符能够用来建立普通块和客户块。
CRT块(CRT block):是由C RunTime Library供本身使用而分配的内存块。CRT库本身来管理这些内存的分配与释放,一般你不会在内存泄漏报告中发现有CRT内存泄漏,除非程序发生了严重的错误(例如CRT库崩溃)。
ide