new和malloc的区别

@TOC

(1)new和delete是C++的关键字/运算符,malloc与free是c++/c语言的标准函数

(2)malloc需要显式地指定分配的内存大小,new不需要。

(3)new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从上动态分配内存。
【注】凡是通过new操作符进行内存申请,该内存即为自由存储区。

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

(5)new操作符内存分配失败时,抛出bad_alloc异常;malloc内存分配失败时返回NULL

(6)new操作符有构造函数和析构函数,在开辟空间的同时,会调用自定义对象的构造函数来完成初始化;malloc只会开辟空间。

(7)malloc分配空间后,可以通过realloc扩张内存;new操作符则不能进行再次扩张内存的操作。

(8)new相对malloc效率要低,因为new的底层封装了malloc。

【注】C++允许重载new/delete操作符。

【注】new在底层怎么实现的?
new操作符是把构造函数实例化成一个对象
编译器在转换的时候调用了一个函数:opreator new,而这个函数恰恰就是new的底层实现!

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }

operator new函数本质也是封装了malloc的函数,并且当申请内存空间失败的时候不再是返回NULL,而是抛出异常!
new的工作原理
底层调用operator new函数进行空间的申请,申请到空间以后,调用对应的类的构造函数进行初始化
delete的底层实现原理
调用的就是operator delete函数,对应的就是封装了free的函数

注意:这里的operator new并不是对new的重载!这个operator new是一个单独的函数,如果需要调用就要显式写出opreator new!

//显示调用operator new
#include<iostream>
using namespace std;
int main()
{
    int* pa = new int;
    //显式调用必须这样!
    void* pa = operator new(sizeof(int));
    return 0;
}

【注】用new分配一个数组之后,之后用delete[]释放掉,那这个delete怎么知道应该释放多大一片内存呢?
new int[10]时,malloc本应该申请10个A类型大小的空间,也就是40个字节,但是此时malloc实际上申请了44个字节,new返回的指针是malloc返回的指针向后偏移4个字节的地址
这4个字节存放着所申请自定义元素的个数。

delete[]的原理: delete[]会把new[]所返回的指针向前偏移4个字节的地址返回给free,因此free就能正确的释放掉整片空间。

多出来4个字节保存着自定义元素的个数的作用:
一个对象在释放空间前需要调用析构函数来完成一些资源的清理工作。那么问题来了,delete[] 没有像new A[10]传参进去,delete[]怎么知道调用多少次析构。其实多出来的4个字节存的元素个数,就是用来让delete[]知道调用多少次析构函数的

【注】对于没有自定义析构器的class或者struct,在delete时不需要调用其析构器,
所以可以将整块数组当成一个整体来处理,也就可以使用delete直接释放这一整块内存空间。

【注】而对于自定义了析构器的class或者struct,在delete时需要逐个调用其析构器,
所以需要有标识位记录数组大小,然后通过数组大小来逐个调用其析构器,再释放内存。
互联网学习 文章被收录于专栏

互联网知识点

全部评论
感谢楼主分享,很有用
3 回复 分享
发布于 2022-08-30 09:09 江苏

相关推荐

腾讯teg-后端&nbsp;一面&nbsp;2025/03/191h40min-&nbsp;2道算法题:&nbsp;&nbsp;-&nbsp;只有012的数组按012的顺序摆放(不使用代码库的排序函数)面试官希望不使用排序的思路&nbsp;&nbsp;-&nbsp;lc442&nbsp;数组中重复的数,O1空间,On时间&nbsp;&nbsp;-&nbsp;第二题做不出来,换成:最长不重复子串(a了)-&nbsp;八股(计网、mysql、操作系统、数据结构)拷打&nbsp;&nbsp;-&nbsp;两端建立通信,客户端抓包可以抓到哪些包&nbsp;&nbsp;-&nbsp;linux&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;dmesg&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;ps、pidstat&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;系统oom,查日志&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;查某个程序运行在哪个目录&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;strace&nbsp;&nbsp;-&nbsp;dma是&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;DMA(Direct&nbsp;Memory&nbsp;Access,直接内存访问)&nbsp;是计算机系统中一种高效的数据传输技术,允许外部设备(如硬盘、网卡、显卡等)直接与内存(RAM)交换数据,而无需通过&nbsp;CPU&nbsp;的介入。这种方式大幅降低了&nbsp;CPU&nbsp;的负担,提升了系统整体性能。&nbsp;&nbsp;-&nbsp;线程、协程;协程共享线程的寄存器吗、线程共享进程的哪些东西、进程如何切换&nbsp;&nbsp;-&nbsp;系统调用&nbsp;&nbsp;-&nbsp;数据结构&nbsp;哈希表,发生冲突怎么办&nbsp;&nbsp;-&nbsp;go程序发生内存泄露怎么排查&nbsp;&nbsp;-&nbsp;go的make、gmp的worker&nbsp;steal、全局G队列&nbsp;&nbsp;-&nbsp;什么时候选择多线程执行、什么时候选择单线程&nbsp;&nbsp;-&nbsp;tcp的keepalive和http的keepalive、tcp保活机制、接受到历史请求怎么处理&nbsp;&nbsp;-&nbsp;对大模型的看法&nbsp;&nbsp;-&nbsp;说说项目里的h264解码同程旅行-后端&nbsp;一面&nbsp;2025/03/2050min(无算法,俩面试官)-&nbsp;主要是聊项目、实习的产出&nbsp;&nbsp;-&nbsp;音视频这个项目主要做了什么,作为组长负责了啥&nbsp;&nbsp;-&nbsp;OTEL&nbsp;sdk怎么用的,里面有什么属性,怎么上报的&nbsp;&nbsp;-&nbsp;基于项目背景,问了一些sql怎么写-&nbsp;linux的命令&nbsp;&nbsp;-&nbsp;查看网络连接&nbsp;&nbsp;-&nbsp;查看某个端口属于哪个程序&nbsp;&nbsp;-&nbsp;查某个端口的连接处于什么状态-&nbsp;tcp四次挥手-&nbsp;http的结构-&nbsp;实习公司内部框架,微服务项目结构等等-&nbsp;sql注入&nbsp;&nbsp;-&nbsp;检验&nbsp;&nbsp;-&nbsp;orm层:mybatis&nbsp;参数化查询-&nbsp;个人未来三年规划腾讯teg-后端&nbsp;二面&nbsp;2025/03/241h13min-&nbsp;面试官介绍了6~8分钟部门负责的内容(服务流量上亿)-&nbsp;三题:&nbsp;&nbsp;-&nbsp;查TCP的长连接&nbsp;和&nbsp;监听的端口(netstat&nbsp;的-p表示啥)&nbsp;&nbsp;-&nbsp;最长不重复子串&nbsp;&nbsp;-&nbsp;由三种括号组成的字符串,判断合法性,有优先级:{&amp;amp;gt;[&amp;amp;gt;(-&nbsp;go的context概念?场景?被调用方怎么知道ctx超时结束了?(select&nbsp;{&amp;amp;lt;-ctx.Done()}&nbsp;)-&nbsp;mysql的gap&nbsp;lock概念?场景?-&nbsp;mysql,只有主键索引,查询时使用其他字段去查询的话,是怎么解决一致性问题的?(MVCC)-&nbsp;口述执行细节:无序链表变成有序。(一开始说了冒泡算法,后面想起了自底向上的归并排序)-&nbsp;tcp三次握手中第二次握手丢失会怎么样?-&nbsp;客户端发送第三次握手(丢失)后,又发送数据包,会怎么样?&nbsp;&nbsp;-&nbsp;https://zhuanlan.zhihu.com/p/706132932&nbsp;&nbsp;-&nbsp;客户端没有发数据包:ACK&nbsp;报文是不会有重传的,当&nbsp;ACK&nbsp;丢失了,就由对方重传对应的报文&nbsp;&nbsp;-&nbsp;客户端有发数据包:在第三次握手中的ACK报文段,根据RFC&nbsp;793,是可以携带数据的。这是因为此时连接已经基本建立,客户端可以开始发送应用数据,而不需要额外的往返时间(RTT)。除了最初的连接建立请求(SYN报文段)之外,TCP规定所有其他报文段,包括数据传输报文段和连接关闭报文段,都应该将ACK标志位设置为1。可以看到,客户端发送的这个数据包,它也会把ACK标志置为1,那么服务端就可以把这个数据包当做是ack确认包从而建立连接。-&nbsp;实习期间遇到的最大难点,如何解决-&nbsp;团队协作遇到的难点-&nbsp;反问:自适应限流算法常用吗?比较理想,计算有延后性,像一些吞吐量大、敏感的场景就用不上,最常用的还是简单的限流算法,比如平等地按比例限流。腾讯-后端&nbsp;三面&nbsp;2025/03/2740min-&nbsp;简单自我介绍-&nbsp;实习里最有难点的地方。(就是比较难实现的点)-&nbsp;负载均衡算法,一致性哈希算法扩缩容-&nbsp;从文件系统中读取后修改,再通过socket发送网络,里面涉及了几次数据拷贝&nbsp;&nbsp;-&nbsp;底层怎么做?(sendfile)零拷贝,mmap是什么?(mmap+write:使用mmap代替read,减少一次CPU拷贝,节省一半的内存空间)&nbsp;&nbsp;-&nbsp;mmap实现零拷贝_mmap&nbsp;零拷贝-CSDN博客-&nbsp;多副本怎么保证一致性?(只知道redis的redlock)了解强一致性算法吗?-&nbsp;设计题:一个微博系统,类似发个朋友圈,需要什么结构存储这种文章列表?大v这种,有大量的粉丝,怎么设计?(单用消息队列缓解写压力还不够,可以给每个人维护自己的大v列表,查完普通朋友的文章再另外去看大v有没有发文章,这样大v就不用往大量粉丝的文章列表里一直写入)-&nbsp;服务怎么保证高可用?(说了很多事后解决方案)说一下预防的手段、除了组件内部自身的高可用,自己能做的有哪些,负载均衡在哪一方做的,自动计算权重的吗?(我们要传入接口耗时等数据,然后负载均衡再计算)-&nbsp;最近学习的新技术?平时如何学习一个新的技术?看什么公众号、网站学习的?腾讯研发管理部-后端&nbsp;HR面&nbsp;2025/03/2825min-&nbsp;面试前发了云证-&nbsp;聊项目遇到的难点,有没有失败过的项目-&nbsp;对于工作看重哪些地方-&nbsp;要不要回学校搞毕设什么的-&nbsp;反问
点赞 评论 收藏
分享
04-21 22:42
深圳大学 C++
面试过程面试官反馈一般,下来复盘才知道是自己很多地方答的不好1.你在哪里,我是面试官2.自我介绍3.熟悉什么语言4.&nbsp;Java:&nbsp;HashMap&nbsp;底层数据结构,数据存储是放在哪里的。扩容策略,多少倍5.&nbsp;进程和线程的区别6.&nbsp;进程间通信有哪些方式?管道是什么,是阻塞的吗7.&nbsp;1G内存的电脑可以打开2G的文件吗&nbsp;&nbsp;(不一定是windows上打开文件,对虚拟内存实际情况掌握不好)虚拟内存呢,你知道是什么吗,原理是什么32位对应的虚拟内存大小8.&nbsp;1G内存排序2G无序数组&nbsp;(没答好,归并排序每次只需要比较两个队头&nbsp;才是核心)9.&nbsp;Linux系统修改文件权限,需要对所有用户可读写,如何做?(没答好,忘记第一个是拥有者了,而且“所有人”包括拥有者)10.&nbsp;.txt&nbsp;文件里快速统计出一个字符串的数量&nbsp;(我答得KMP不满意。面试官反问要用算法吗)11.&nbsp;聊网络。什么是TCP、IP协议。和HTTPS协议有什么区别?TCP三次握手12.redis和MySQL熟悉吗?聊聊&nbsp;Mysql,innodb索引结构是怎么样的,B树还是B+树?索引数据是存在哪里的?检索策略是怎么样的13.Mysql&nbsp;什么时候会发生死锁&nbsp;(下来搜才发现情况蛮多的)死锁必要条件有哪些 14.谈项目吧为什么要把服务器换为网络服务器呢?消息对方没接收到,如何重发呢?项目有哪些挑战?(粘包)为什么要用&nbsp;protocbuf&nbsp;15.多路复用起什么作用?16.开发问题,如果导师给你一个项目,你如何开始&nbsp;(我先规划)如果项目很急呢?(先规划)就是很急&nbsp;(套用网上类似策略)如何快速投入呢?17.&nbsp;反问我们是跨界携程有&nbsp;to&nbsp;c业务,goole&nbsp;seo,&nbsp;架构主要是&nbsp;golang总部在香港#牛客AI配图神器#
路边野狗:我二面没问一个技术问题挂了😂
查看17道真题和解析
点赞 评论 收藏
分享
评论
4
28
分享

创作者周榜

更多
牛客网
牛客企业服务