malloc与new的区别

简介:

malloc与new的区别 

从本质上来说,malloc是libc里面实现的一个函数,如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error:‘malloc’ was not declared in this scope。如果生成了目标文件(假定动态链接malloc),如果运行平台上没有libc,或者libc中没有malloc函数,那么会在运行时(Run-time)出错。new则不然,是c++的关键字,它本身不是函数。 new不依赖于头文件, c++编译器就可以把new编译成目标代码(g++4.6.3会向目标中插入_Znwm这个函数,另外,编译器还会根据参数的类型,插入相应的构造函数)。
在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的 指针,并且可以自动计算所需要大小。比如:
1
2
3
int *p;
p= new  int ;
//返回类型为int*类型(整数型指针),分配大小为sizeof(int);
或:
1
2
3
int *parr;
parr= new  int [100];
//返回类型为int*类型(整数型指针),分配大小为sizeof(int)*100;
而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的 指针
1
2
3
4
5
6
7
int *p;
p=( int *) malloc ( sizeof ( int )*128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=( double *) malloc ( sizeof ( double )*12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中
第一、malloc 函数返回的是 void * 类型。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将 强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。
第二、函数的 实参为 sizeof(int) ,用于指明一个 整型数据需要的大小。
在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的;
但是在某些系统中是不允许malloc(0)的。在规范的程序中我们有必要按照这样的格式去使用malloc及free:
1
2
3
4
5
6
7
8
9
10
type*p;
if (NULL==(p=(type*) malloc ( sizeof (type))))
/*请使用if来判断,这是有必要的*/
{
perror ( "error..." );
exit (1);
}
... /*其它代码*/
free (p);
p=NULL; /*请加上这句*/
malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
比如想分配100个int类型的空间:
1
2
int *p=( int *) malloc ( sizeof ( int )*100);
//分配可以放得下100个整数的内存空间。
另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到 指针,在其它操作上保持一致。
对其做一个特例补充
1
2
3
4
5
char *ptr;
if ((ptr=( char *) malloc (0))==NULL)
puts ( "Gotanullpointer" );
else
puts ( "Gotavalidpointer" );
此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的 指针
 
 
 
参考文章
百度百科,malloc函数
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5072784.html ,如需转载请自行联系原作者

相关文章
|
运维 监控 安全
数字孪生与矿业:提高开采效率
数字孪生技术在矿业领域的应用正逐步改变传统采矿模式,通过创建矿山的虚拟模型并实时集成数据,提高开采效率、优化资源利用、降低安全风险。本文深入探讨其在精准勘探、优化开采计划、实时监控与故障预警等方面的应用,以及带来的优势和典型案例。
|
9月前
|
存储 弹性计算 运维
课时1:阿里云云服务器ECS介绍
阿里云ECS服务器解决了传统服务器采购周期长、资源闲置和维护成本高等问题。企业无需预先采购昂贵硬件,按需购买云服务,具备完善的架构、广泛场景覆盖及卓越性能,支持50多款操作系统,针对21个业务场景优化,提供上百种规格选择。ECS确保数据安全与业务连续性,历史可用性高达99.9999%,助力企业高效转型。
204 0
|
12月前
|
网络架构
Next14 页面与布局 使用
Next14 页面与布局 使用
248 7
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
495 3
|
机器学习/深度学习 数据采集 人工智能
使用Python实现深度学习模型:智能音乐创作与生成
使用Python实现深度学习模型:智能音乐创作与生成
363 3
|
数据采集 算法 数据处理
LabVIEW软件开发任务的工作量估算方法
LabVIEW软件开发任务的工作量估算方法
251 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的马拉松报名系统微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的马拉松报名系统微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
238 1
|
存储 SQL 算法
动态规划详解-最小路径和问题【python】
动态规划详解-最小路径和问题【python】
|
缓存 Linux
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Deepin镜像
深度操作系统 Deepin,是一个基于 Linux 内核,以桌面应用为主的开源 NU/Linux 操作系统,支持笔记本、台式机和一体机。
1309 0
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Deepin镜像
|
数据可视化 Linux iOS开发
Linux如何安装Terminus终端
Linux如何安装Terminus终端
Linux如何安装Terminus终端