【006 关键字】new/delete与malloc/free的区别是什么?

一、前言

在C语言中使用malloc、free动态分配以及释放内存,相对应的,在C++中使用new、delete动态分配和释放内存(C++中为了兼用C语法,所以保留malloc和free的使用,但建议尽量使用new和delete)。


二、malloc、free的用法

在C语言中使用malloc和free需要加入stdlib.h头文件两个函数的原型是:

void *malloc(size_t size);
void free(void *pointer);

使用举例:

int *p=(int *)malloc(64);            //指向整型的指针p指向大小为64字节的内存的地址
int *p=(int *)malloc(4*sizeof(int)); //指向整型的指针p指向4个int整型空间的地址

通过上面的函数原型可知,malloc()函数的返回值类型为void *,如果赋值给int * 类型的指针,需要在malloc函数前进行强制类型转换

一般在使用之前需要验证:

if(p==NULL)
    printf("内存分配错误!\n");

用完之后需要进行内存释放:

free(p);

有关void*的用法,详见这里


三、new、delete的用法

使用举例:

int *p = new int;  //创建了一个整形对象 返回指向该内存的首地址
int *p = new int();//和上面相同 只使将下指向的整形变量的值初始化为0
int *p = new int(1);//初始为1

delete需要配合new使用,以防止内存泄露:

delete p;

此时p仍然是个int *类型的指针,保存的仍然是刚才的整形空间的地址,但是指向的内存已经被释放了,因此指针p无效,需要及时置为空指针:

p = NULL;

注意:使用new、delete创建动态数组和释放相关内存使用举例如下:

int *p=new int[];              //指针p所指向的数组未初始化
int *p=new int[m];             //指针p指向长度为m的数组,未初始化
int *p=new int[]();            //指针p所指向的地址初始化为0
delete [] p;                   //回收p所指向的数组


四、new/delete与malloc/free的区别

1、属性

new、delete是C++中的操作符需要编译器支持,而malloc和free是标准库函数,需要加入头文件stdlib.h。

2、参数

malloc需要自行指定动态分配内存的大小,而new在指定指针类型之后可以自动分配内存,无需指定大小。

3、返回值类型

malloc返回的指针需要进行强制类型转换,new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,

4、分配失败

new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

5、自定义类型(指针)

对于非内部数据对象(C++)来说,只使用malloc是无法完成动态对象要求的,一般在创建对象时需要调用构造函数,对象消亡时,自动的调用析构函数。而malloc free是库函数而不是运算符,不在编译器控制范围之内,不能够自动调用构造函数和析构函数。

new在为对象申请分配内存空间时,可以自动调用构造函数,同时也可以完成对对象的初始化。同理,delete也可以自动调用析构函数。

mallloc只是做一件事,只是为变量分配了内存,同理,free也只是释放变量的内存。

  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值