c++中malloc和new对比
使用malloc和new是由于为了节约内存,很多数据都是动态生成的。
1.malloc函数
如下是分配长度为100个字节的内存块,返回值为void* ,表示未确定类型的指针。因此往往需要加上强制转换,如下所示,malloc和free一起使用。
char *p;
p=(char *)malloc(100); //分配成功则返回分配后内存空间的首地址,不成功则返回空指针null
1.1malloc函数实现原理:
1)malloc 函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。
2)调用 malloc(n)函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。 然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。
3)调用 free 函数时,它将用户释放的内存块连接到空闲链表上。
4)到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段, 那么空闲链表上可能没有可以满足用户要求的片段了。于是,malloc()函数请求延时,并开始在空闲链表上检查各内存片段,对它们进行内存整理,将相邻的小空闲块合并成较大的内存块。
1.2为什么会大于请求长度n是由于:需要内存对齐
如某个机器的整型长度为4个字节且它的起始存储位置能够被4整除,那么结构体
struct ALLGN {char a;int b;char c;
};
实际申请内存大小要为4的整数倍,因此该结构体所占大小为12字节,实际只使用到6个字节
内存对齐详见:https://blog.csdn.net/misskissc/article/details/14647845
2.new函数
和上述一样也是动态分配堆内存,new和/delete一起使用
new用法
//开辟单地址空间int *p = new int; //开辟大小为sizeof(int)空间int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。//开辟数组空间//一维int *a = new int[100]{0};//开辟大小为100的整型数组空间,并初始化为0。//二维int (*a)[6] = new int[5][6];//三维int (*a)[5][6] = new int[3][5][6]
delete用法
//释放单个int空间int *a = new int;delete a;//释放int数组空间int *b = new int[5];
3.malloc/free和new/delete的区别
(1)属性
malloc/free是C/C++库函数,需要头文件支持。new/delete是关键字,需要编译器支持。
(2)内存区域
new/delete不仅会分配内存,还会自动调用构造和析构函数,而malloc和free只会分配内存。
(3)参数
new申请无需指定内存大小,而malloc需指定内存
(4)返回类型不一样
new返回的是对象类型的指针,如int *p = new int;返回的就是一个int型指针。
而malloc返回的是*void,即无类型的指针,需做强制性转化,见上第一个例子。
(5)重载
C++允许重载new/delete操作符,malloc不允许重载
(6)分配失败
new分配失败,会爆出bac_alloc异常,malloc分配异常返回null
(7)内存泄漏
内存泄漏对于new/delete都能检测出来,而new可以指明是文件的哪一行。而malloc不可以。
Reference :
https://blog.csdn.net/nyist_zxp/article/details/80810742
https://blog.csdn.net/damage233/article/details/81116115
c++中malloc和new对比相关推荐
- 2017年首份中美数据科学对比报告,Python受欢迎度排名第一,美国数据工作者年薪中位数高达11万美金
最新消息,Kaggle最近对机器学习及数据科学领域进行了全行业深度调查,调查共收到超过 16,000 份回复,受访内容包括最受欢迎的编程语言是什么,不同国家数据科学家的平均年龄是什么,不同国家的平均年 ...
- CIKM'21 | 谷歌:推荐中的自监督对比学习
作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP 1.对比学习到底是啥 对于最近很火的"对比学习",许多人把它和我们之前经常用的向量化召回混为一谈 ...
- Excel中两列数据对比,找出不同数据如何查找重复项并统计重复次数
Excel中两列数据对比,找出不同数据 问题1 excel如何查找重复项并统计重复次数 问题2
- 数据分析中常用分析思路对比分析解析(一)
对比是识别事物的基本方法对比--横向.纵向及多维度对比比值比率背后的逻辑指标的逻辑与管理指标对标的层次和维度标杆管理与榜样的力量. 4.1 对比是识别事物的基本方法 对比是最基本的数据分析方法,也是其 ...
- 中科大计算机科学与浙大比,高校实力大比拼:浙大和中科大的实力对比
说实话,本来不准备写这篇文章的,因为其实每所高校都有自己的优势学科,有自己的办学特点,办学实力强了对国家对社会的贡献更加强大!没必要非要为那些虚名争个你死我活.但是目前看了很多网络上的观点,却发现某些 ...
- Spring WebFlux运用中的思考与对比
系列目录: Spring WebFlux运用中的思考与对比 CompletableFuture与Spring的Sleuth结合工具类 CommpetableFuture使用anyOf过程中的一些优化思 ...
- springBoot中jetty tomcat undertow对比与undertow线程池配置
springBoot中jetty tomcat undertow对比 1)tomcat优点是稳定性好.可靠性高.支持 Servlet 和 JSP 等标准.构建中小型的 Web 应用程序,可以选择 To ...
- 2022中低端电动车横向对比(2022.11.13)
2022中低端电动车横向对比(2022.11.13) 对比表格 品牌 型号 价格 电池 航程 刹车 电机 开锁车 新国标 其他 备注 雅迪 钉钉/淘淘 1999/1899 铅酸 40KM 前后鼓刹 3 ...
- 图像处理(三) 均值滤波与中值滤波的对比
均值滤波与中值滤波的对比 均值滤波与中值滤波 实验对比 matlab 代码 均值滤波与中值滤波 均值滤波是典型的线性滤波算法,均值滤波是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法 ...
最新文章
- VS2008让Release配置也能调试起来~
- Level3公司在哥伦比亚开通运营第三个数据中心
- 两种获取connectionString的方式
- python处理teradata数据库_Teradata数据库——你需要了解的基础知识
- 路由器命令大全手册教程 4
- pytorch实现L2和L1正则化regularization的方法
- 让JavaScript回归函数式编程的本质
- [转载] ANTLR——编译原理基础知识
- 思科路由器IKEV2 L2L***预共享密码认证最简化配置
- NumPy学习_00 ndarray的创建
- 【VMware vSAN 6.6】5.5.Update Manager:vSAN硬件服务器解决方案
- 腾讯视频怎样关闭推送迷你页面
- .net 事务处理的三种方法
- Codeforces Round #723 (Div. 2)B. I Hate 1111(完全背包)
- python unicode编码转换中文_Python入门高级教程--Python 中文编码
- 机器学习中对不均衡数据的处理方法
- Google Earth Engine ——消除影像色差直方图匹配算法(CDF累计分布函数)!
- 分享两款免费的流程图、原型图工具
- 阿里云配置服务器,短信,域名
- SpringBoot2.6.x集成swagger: Failed to start bean ‘documentationPluginsBootstrapper问题解决
热门文章
- 主流的Bootstrap 在线编辑器
- 技术人如何打造出日赚1000+美元的赚钱利器(转https://gitbook.cn/gitchat/activity/58f8d110b75ae65904c10628?utm_source=csd)
- python运行按钮灰色_关于Android Studio中Run按钮是灰色的解决
- 商用密码算法的实现(常见的密码算法库)
- FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔
- 高通CES 2018发布QCC5100低功耗蓝牙芯片
- 2022数据合规与安全论坛
- 智能写作,产品总监竟然........
- Java安装开发环境
- android+省电播放器,播放耗电:QQ影音等三款最省电_软件资讯软件评测-中关村在线...