malloc和new的区别

4 篇文章 0 订阅

最近找实习生,这个问题被问的太多了,所以想把最近被高频率问到的东西整理一下,以备后续复习。

一、malloc和new的区别:
1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

2、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针,需要进行强转。

3、如果malloc失败返回空指针,new失败会抛一个bad_alloc的异常

二、C++为什么要使用new,new的底层也是调用了malloc
1、对于非内置类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

2、、C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

三、既然new可以替换malloc为什么C++还要支持malloc?
C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

四、malloc()到底从哪里得到了内存空间?
从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

五、new和delete的整个流程
第一步: 调用库函数operator new,分配可以容纳一个Student类型对象的原始的、无类型的内存;
第二步: 根据给定的实参,调用Student类的构造函数,以构造一个对象;
第三步: 返回在第二步中被构造对象的地址。
对应地,上面的delete表达式,也实际上做了2步工作:
第一步: 调用Student类的析构函数,以销毁对象。这一步完成后,对象已经被销毁,但该对象占用的内存此时仍然没有
返还给系统;
第二步: 调用库函数operator delete,将已经被删除对象所占用的内存交回给系统。
需要特别注意的是,new表达式和库函数operator new不是一回事情,事实上,new表达式总是会调用更底层的库函数operator new。delete表达式和库函数operator delete之间的关系也与此类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值