码农知识堂 - 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 - 博客园

  • 相关阅读:
    Excel提高工作效率常用功能
    给工资低的朋友6个搞钱建议,作为副业,闷声发小财
    Java调用第三方http接口的常用方式
    大模型引领未来:探索其在多个领域的深度应用与无限可能【第三章、医疗领域:大模型助力医疗健康创新】
    奇舞周刊第 459 期 精读《web reflow》
    2022“杭电杯”中国大学生算法设计超级联赛(6)签到题5题
    【GIS前言】OGIS如何跨分布式计算平台
    TCP传输的粘包问题和各种异常情况
    谁是卧底线下发牌器微信小程序源码下载,强大的自定义功能
    跟艾文学编程《Python基础》Anaconda 安装
  • 原文地址:https://blog.csdn.net/K346K346/article/details/126772184
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号