首页 > 其他分享 >new vs malloc

new vs malloc

时间:2024-02-27 14:33:06浏览次数:23  
标签:malloc vs 操作符 内存 operator new delete

https://www.cnblogs.com/qg-whz/p/5140930.html

1、申请内存位置

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。

自由存储区不仅可以是堆,还可以是静态存储区,取决于operator new的实现细节。

C++ 自由存储区是否等价于堆?

2、返回类型安全

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

3、内存分配失败时的返回值

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

4、是否需要指定内存大小

使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。

5、是否调用构造析构函数

new分配对象:

  1. 调用 operator new分配内存
  2. 调用构造函数在这块内存构造对象
  3. 返回指针

delete:

  1. 调用指定内存对象的析构函数
  2. 调用operator delete释放空间

6、对数组的处理

C++提供了new[]与delete[]来专门处理数组类型,而且会在每个对象的内存上用构造函数初始化对象。而malloc分配的是原始内存,编译器并不知道内存是放对象还是对象数组。

7、new与malloc是否可以相互调用

operator new /operator delete的实现可以基于malloc,而malloc的实现不可以去调用new。

8.是否可以被重载

opeartor new /operator delete可以被重载。而malloc/free并不允许重载。

标签:malloc,vs,操作符,内存,operator,new,delete
From: https://www.cnblogs.com/hellozhangjz/p/18036817

相关文章

  • VSCode+Vim 开发
    VSCode+Vim开发一、安装及配置vim插件0.安装vim拓展1.拷贝配置到settings.json中settings.json在"文件"->"首选项"->"设置"->"文本编辑器"{"vim.easymotion":true,"vim.incsearch":true,"vim.useSystemCl......
  • NEW CONCEPT ENGLISH 1 (1-10)
    NEWCONCEPTENGLISH 1-10Lesson1ExcusemeKeywordsandexpressionsexcuseme 劳驾,请问,对不起pardon n. 原谅,请再说一遍handbag n. 女士手提包thankyou 感谢你(们)verymuch 非常地LanguagepointsExcuseme 在别人身边挤过,和陌生人搭话,打断别......
  • 修改VSCODE默认模板(live template)
    1.问题在使用VSCDOE编写html文件时,对于使用的语言这一块,公司统一要求但是VSCODE默认的是,这就需要我们每次都手改一下,非常麻烦,结合IDEA里面使用livetemplate的经历我就在思考能否修改VSCODE的相关配置文件达到同样的效果呢?首先我找到了这个参考:如何修改vscode模板这里要求我......
  • Linux:离线搭建vsftpd服务并记录新建用户登录报错问题(转载)
    1.检查本机是否安装过vsftpd#检查是否存在vsftpdrpm-qa|grepvsftpd2.下载离线安装包下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=vsftpd(x86-64)3.开始安装vsftpd#安装vsftpdrpm-ivhvsftpd-3.0.2-21.el7.x86_64.rpm4.测试是否安装成功......
  • 文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题
    一、对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数,第二种方法是运行RECURSIVE-MATRIX-CHAIN。证明你的结论。如果写代码,请用go语言。对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种......
  • vscode报错,nodemon 在此系统上禁止运行脚本
    1.vscode报错,nodemon:因为在此系统上禁止运行脚本注意:不仅仅适用于nodemon报错,报在此系统上禁止运行脚本的错都可以用以下方法解决2.报错原因分析:windows为了安全,默认的执行策略为Restricted,因此需要将执行策略设置为RemoteSigned即可3.解决方法  (1)get-exec......
  • MMFN论文阅读笔记(Multi-modal Fake News Detection on Social Media via Multi-graine
    论文标题:Multi-modalFakeNewsDetectiononSocialMediaviaMulti-grainedInformationFusion论文作者:YangmingZhou,YuzhouYang,QichaoYing,ZhenxingQian,XinpengZhang论文来源:ICMR2023,paper论文代码:暂无介绍目前的多模态方法主要集中在文本和视觉特征的融......
  • vscode格式
    ctr+shift+P  搜settings.json {"security.workspace.trust.untrustedFiles":"open","vetur.format.options.tabSize":4,"vetur.format.defaultFormatterOptions":{"prettier":{......
  • 什么是DevSecOps
    什么是DevSecOpsDevSecOps是一场关于DevOps概念实践或艺术形式的变革。DevOps之父PatrickDebios强调:“DevOps2.0时代应首先解决人的问题”,要学会系统化思考与全面思考,包括安全性、容量、连续性等内容。DevSecOps是DevOps开发运维一体化运动的一种延伸。在开发运维中融入安......
  • C# vs2015 .dll模块联合开发好的应用程序进行调试
    C#vs2015.dll模块联合开发好的应用程序进行调试右键项目->属性,1.点击“调试”侧边菜单,在“启动操作”选项中选择“启动外部程序”,然后选择应用程序的exe文件的路径2.点击“生成”侧边菜单,在“输出”选项中“输出路径”中选择将当前调试项目的最新dll文件(最新的代码)输出到应用......