码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ malloc 与 new 的区别


    文章目录

    • 1.区别
    • 2.小结
    • 参考文献

    C++ malloc 与 new 有什么区别?这是一道经典的面试题。

    1.区别

    下面我们就来看一下到底有哪些区别。

    • 属性

    new/delete 是 C++ 的操作符,而 malloc/free 是库函数。

    • 参数

    使用 malloc 为对象指针分配内存,要明确指定分配内存的大小,而 new 不需要,编译器会根据类型信息自行计算。

    • 返回类型

    new 分配内存成功,返回对象指针,无须进行类型转换;而 malloc 分配成功返回 void* 类型指针,需要通过强制类型转换将 void* 指针转换成我们需要的类型。

    • 初始化(最大区别)

    new 会先调用 operator new() 函数,申请足够的内存(通常底层使用 malloc 实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete 先调用析构函数,然后调用 operator delete() 函数释放内存(通常底层使用 free 实现)。

    malloc/free 是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

    • 重载

    new 作为操作符,可以被重载,而 malloc 不行。

    • 分配失败

    new 如果分配内存失败会抛出 bad_alloc 异常;而 malloc 分配内存失败会返回 null 指针。

    • 内存区域

    new 操作符从自由存储区(free store)上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存。

    自由存储区是 C++ 基于 new 操作符的一个抽象概念,凡是通过 new 操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C 语言使用 malloc 从堆上分配内存,使用 free 释放已分配的对应内存。自由存储区不等于堆,比如我们可以重载 operator new() 返回栈内存,然后调用 placement new() 在栈上初始化对象。

    堆是一个实际的区域,而自由存储区是一个更上层的概念。通常 new 确实是在堆上申请内存,但是程序员可以自己重载 new 操作符,使用其他内存来实现自由存储(这并不常见)。另外,C++ Primer Plus 这本书上有提到 palcement new,可以为对象在栈上分配内存。总的来说,自由存储区是 new 申请内存时的概念。

    2.小结

    C++ malloc 与 new 有很多区别,最重要的是要答出“初始化”这个区别,这应该是面试官最想听到的回答。


    参考文献

    经典面试题之new和malloc的区别 - CSDN博客
    C++ new 的三种面貌 - CSDN博客
    C++ 自由存储区是否等价于堆? - melonstreet - 博客园

  • 相关阅读:
    《Attention Is All You Need》论文笔记
    C++面向对象三大特性之一---->继承详解
    地图可视化 | 8月22日重庆山火分布地图及制作方法
    QT 字符串操作常用接口函数
    uni-number-box的坑-无法实现数据双向绑定
    手写eventbus,ts
    iOS开发之自定义的framework添加第三方framework,lipo和ar命令看.o文件
    HTTP 3的发布
    R语言使用forestploter包绘制单组及双组森林图(2)(附有超详细备注)
    【Vue项目】通过设置全局的异常处理来统一处理后端返回的异常
  • 原文地址:https://blog.csdn.net/K346K346/article/details/126772184
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号