new/delete是C++的运算符。malloc与free是C++/C语言的标准库函数,new/delete只能在C++中使用,malloc与free在C与C++中都能够使用,它们都可用于申请动态内存和释放内存。 下面说说它们的用法与不同之处: 1、new/delete new 类型 : int *pi=new int; //分配一个int大小的内存空间,并用指针pi指向该内存,返回值为int*;相当于int *p=(int*)malloc(sizeof(int)); new 对应 delete 用法:delete pi; malloc 对应 free 用法:free(pi);
new 类型[]: int *pi=new int[100];//分配100个int大小的内存空间,并用指针pi指向该内存,返回值为int*;相当于int *p=(int*)malloc(100*sizeof(int)); new 对应 delete 用法 :delete []pi;
malloc 对应 free 用法: free(pi);
注意:在delete之后,重设指针的值。 执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址, 然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂 指针指向曾经存放对象的内存, 但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。一旦删除了指针所指的对象,立即将指针置 为0,这样就非常清楚的指明指针不再指向任何对象。(零值指针:int *ip=0;) 如:
1 int *pi=new int;2 if(!pi==NULL)3 {4 //分配失败5 //异常处理6 }7 delete pi;8 pi=NULL;
特别注意:new与delete搭配,malloc与free搭配,千万不要混用。
拓展:realloc
函数原型:void *realloc(void * p, unsigned int size);// p指向原来分配的内存空间,size表示重新分配的内存空间大小。
作用:对malloc申请的内存空间进行重新分配,通常是为了改变原来申请的内存空间大小。