new和malloc的区别

本文对比了C++中new关键字与C语言中malloc函数在内存分配上的不同之处,包括它们在内存位置、大小计算、初始化行为、返回值类型及是否可重载等方面的差异。

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

在c++中开辟内存,常用关键字new来开辟,new+类型     eg:int *p=new int;

                                  new来分配内存时:(1)调用operator new 函数(对于数组是operator new[])分配一块足够大的、未名的内                                   存空间以便存储特定类型的对象。(2)编译器运行相应的构造函数以构造对象,并为其传入初值。(3)对                                      象构造完成后,返回一个指向该对象的指针。

                                  用delete释放内存 ,delete+开辟内存变量名       eg:delete p;  

在c语言中开辟内存,用malloc来开辟,malloc的原型是:void *malloc(size_t size);

                                      用free来释放内存,free的原型是:void  free(void *ptr);

二者区别:

(1)从开辟内存的位置上分:

new是从自由存储区域(自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区)开辟,malloc从堆上开辟。

(2)从内存开辟大小上分:

new是编译器会根据类型信息自行计算要开辟内存的大小,而直接分配,malloc是先需要手动用sizof计算内存开辟的大小,再来开辟。

(3)从初始化上看:

new除了可以开辟内存外,还同时进行初始化,而malloc只是单纯的开辟内存,不可以初始化。

(4)从返回值类型上看:

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故返回值类型安全;

malloc返回值类型不安全,由于底层函数是void *malloc(size_t size),内存分配成功则是返回void *,所以需要将void*指针强制类型转换成需要申请的类型,故不安全。

(5)从二者相互关系上看:

new是可以进行重载的,由于new开辟内存是调operator new来执行的,所以可以重载,而malloc不能重载。

new是可以调用malloc来开辟内存的,这也是向前兼容所导致的,而在用malloc开辟内存的时候,还没有new关键字,也不存在调用它。

new可以开辟常量,malloc不可以。

在new开辟常量类型时:一定要初始化,否则开辟的常量没有意义,也无法修改。           eg:const int *p=new const int (10);

new可以重定位:如下例:

      int a;

      char *p  = new(&a) char('a');   //从a的内存中取一截内存来存放char 'a' 

这说明了重定位是new分配的内存并不是“新分配”的,而是原先a的内存单元。因而不用释放delete p的内存,不能使用来释放资源。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值