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++中的内存泄露的方法
- [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库崩溃)。
空闲块(free block):已经被释放(free)的内存块。
忽略块(Ignore block):是程序员显式声明过不要在内存泄漏报告中出现的内存块。
转载于:https://blog.51cto.com/amwing/353670