new和malloc的区别

本文详细对比了C语言的malloc函数与C++的new关键字在内存分配上的区别,包括参数、返回值类型、内存大小计算、数据类型确定以及使用便利性等方面。

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

区别1:
 malloc是C的函数,New是C++的关键词。
 区别2:
 malloc的参数是字节长度,按照参数分配内存,内存空间大小由参数指定,单位字节;
New主要用来创建类、结构对象,当然它包含分配内存的工作,不同的是,分配内存时是按照类或结构的定义来确定要分配多少字节。同时当New一个对象时,还负责调用类的构造函数以便初始化对象成员。同时它也用来动态分配数组,同样的,数组所占字节是通过数组长度和元素类型来确定,用户不能也无需指定确切的内存大小,编译器会在编译时确定(长度*元素类型宽度=所需分配内存大小),用户只需指定需要分配多少个元素及元素类型。

据说实质上,当New确定好字节长度后,最终会调用malloc分配内存。(我没研究过,因为我觉得没意义)
 区别3:
 malloc可以说是通用内存分配函数,它无需知道所分配的内存用于保存什么类型的数据,它只知道需要分配多少字节内存,因此返回的指针是无类型的,也即虚指针。所以,如果你知道该内存空间所保存的数据类型,还需将虚指针强制转换为指定类型的指针。
New所创建的对象、结构、数组,都是可以确定数据类型的,因此返回的是指定的类型指针,无需强制转换,当然,C++具有很强的灵活性,你完全可以先New一个int类型的数组,然后强制转换成4倍空间char类型的数组,这完全没问题,只要数据对齐,保证不越界即可。

因此总体上简单地说malloc灵活,直白简单,但内存和指针维护麻烦,需要转换,需要注意数据对齐,New功能强,使用方便。

那么,针对你的例子,做下说明
(int*)malloc(100*sizeof(int)) 是先取得int类型的字节宽度,然后乘100计算后得到400,然后调用malloc,并将400传递给函数,分配400字节的内存空间,但是返回的是虚指针,即纯地址,该地址的类型是未知的,也即缺少数据宽度的信息。因此最后根据实际要求强制转换为int *。

new int[100]是分配可保存100个整数的内存空间,因为已给定数据类型,因此总共需要分配100*4=400字节的空间,返回int *类型的指针。

综上所述,你的例子中2者实际效果没区别,但是代码和编译过程不同,malloc,需要显式定义内存空间大小和返回指针,new是通过指定类型和元素长度然后编译器隐式计算内存大小,然后按指定类型返回对应的指针。
 
//注意
malloc的返回值是void类型的指针,既然是指针所以在强制类型转换时还是需要变成某种类型的指针。
所以具体用的时候需要强制类型转换。(elemptype*)malloc(sizeof(elemptype));
elemptype指的是这个指针指代的内存空间所保存的数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值