new/delete 和 malloc/free 的区别

malloc和free是c语言的标准库函数,函数原型分别为

void * malloc(size_t size)        参数代表字节个数  

void  free(void * p)                     参数代表内存地址


使用上:

  1. void func()  
  2. {  
  3.     //开辟一个空间  
  4.     int* p1=(int*)malloc(sizeof(int));  
  5.     if(p1==NULL)                       
  6.     {  
  7.          exit(1);  
  8.     }  
  9.      free(p1);  
  10.     //开辟多个空间  
  11.     int*p2=(int*)malloc(sizeof(int)*4);  
  12.     if(p2==NULL)  
  13.    {  
  14.         exit(1);  
  15.     }  
  16.     free(p2);  
  17. }  

new  和    delete

  1. void func()  
  2. {  
  3.     //开辟一个空间  
  4.     int* p1=new int(1);  
  5.     delete p1;  
  6.     //开辟多个空间  
  7.     int*p2=new int[4];  
  8.     delete []p2;  
  9. }  

(1)malloc开辟空间类型大小需手动计算,new是由编译器自己计算;

(2)malloc返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针;

(3)malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制;

(4)无论释放几个空间大小,free只传递指针,多个对象时delete需加[]

(5)因为new/delete是操作符,它调用operator new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载;

(6)对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变




发布了57 篇原创文章 · 获赞 10 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章