new与malloc()的区别

本文对比了C语言中的malloc函数与C++中的new操作符。malloc仅负责内存分配,返回void *类型;new不仅分配内存,还自动调用构造函数初始化对象,并返回对象类型指针。此外,new作为操作符而非普通函数,简化了使用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new与malloc()有什么区别

在c语言中在堆上动态分配一块空间我们可以用malloc()等函数,在c++中我们可以用new,

那么new与malloc()函数有什么不同?

int *p,*q

p=(int*)malloc(sizeof(int))

q=new int

可以看到

1. malloc()函数的返回值要经过转换后才能使用而new可直接使用

2. malloc()是个函数调用而new是个什么?(操作符)

c++是怎样实现new操作的?

有如下代码

 

反汇编如下

 

我们可以看到c++编译器会把new操作符替换为operator new()函数调用,

编译器在遇到new操作符时会计算其后操作数的大小,做为operator new()函数的参数

那么operator new()函数与malloc()函数有何不同?

下面先让我们来看一下malloc()的实现

 

从反汇编代码中我们可以看到,malloc()在其内部调用了_nh_malloc_dbg()来分配空间

接下来让我们看下operator new()

 

发现operator new()在其内部调用了_nh_malloc()来分配空间

再让我来看看_nh_malloc()的实现

 

会发现与malloc()调用了相同的函数去分配空间只不过传给_nh_malloc_dbg()函数的第二个参数不同malloc()的参数叫_newmode,_nh_malloc()的参数叫nhFlag,

下面让我们来看下_nh_malloc_dbg()的注释信息

 

可以看到该函数的第二个参数是标明是否是operator new()函数调用自己 

 

看到这其实你还看不出malloc()与new有什么明显的重要的区别,如果仅仅是这种区别c++的动态对象为什么只能用new?

带着疑问我们来看如下代码

如果是为对象分配空间?

有如下代码

 

反汇编如下

 

你会发现malloc()只会给对象分配8个字节的空间,而new操作符不但会调用operator new()为对象分配空间还会调用构造函数在这块空间上构造对象,,,

这就是malloc()与new最重要的区别了

现在你知道malloc()与new的区别了?

不同:

1. malloc()是一个函数而new是一个操作符

2. malloc()只做一件事分配空间而new操作符不但分配空间而且还调用对象的构造函数在这块空间上构造对象

3. malloc()只返回void *指针而new操作符返回操作对象类型的指针

4. 虽然调用相同的函数分配空间但所用参数不同

相同:

1. 调用了相同的函数分配空间

 

注:vc++6.0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值