C/C++面试:new/delete、malloc/free区别

1059 篇文章 280 订阅

面试

new/delete、malloc/free区别

它们都可以用来在堆上分配和回收空间。new/delete是操作符、malloc、free是库函数、

(1)实现new实际上执行了两个过程:

  • 分配未初始化的内存空间(malloc)
  • 使⽤对象的构造函数对空间进⾏初始化;返回空间的⾸地址。

如果在第⼀步分配空间中出现问题,则抛出 std::bad_alloc 异常,或被某个设定的异常处理函数捕获处理;

如果在第⼆步构造对象时出现异常,则⾃动调⽤ delete 释放内存。

(2)⾏ delete 实际上也有两个过程

  • 使⽤析构函数对对象进⾏析构
  • 回收内存空间(free)。

以上也可以看出new和malloc的区别,new得到的是经过初始化的空间,而malloc得到的是未初始化的空间。所以new是new一个类型,而malloc则是malloc一个字节长度的空间。delete和free同理,delete不仅释放空间和析构对象,delete一个类型,free一个字节长度的空间

为什么有了 malloc/free 还需要 new/delete?

  • 因为对于非内部数据类型而言,光有malloc/free无法满足动态对象的要求。对象在创建的同时需要自动执行构造函数,对象在消亡以前要自动执行系统函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行的构造函数和析构函数的任务强加于malloc/free,所以有了new/delete操作符
  • 由于C++中常常调用C程序,因此malloc/free不能被淘汰

如果在申请动态内存时找不到足够大的内存块,malloc和new将返回null指针,宣告内存申请失败。你是怎么处理内存耗尽的

有两种方法:
(1) 判断指针是否为null,如果是就马上用return终止本函数或者用exit(1)终止整个程序
(2) 为new和malloc设置异常处理函数。比如VC++中可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc和new共享相同的异常处理程序

为什么要使用堆

  • new是为了申请堆内存
  • heap比stack的优势在于容量巨大,一般一个程序只有2M左右[取决于编译器]
  • heap需要手动释放内存,但是随时可以释放,使用stack必须等到声明周期结束后才会释放。
  • 对于声明周期短而且占用空间小的如局部变量用stack,占用空间大的用heap

malloc是怎么申请内存的,free后会释放这块内存吗

对于malloc:

  • 它先扫描之前由free()所释放的空闲内存块列表,以求找到尺寸大于或者等于的一块空闲内存(这取决于具体实现,采用的扫描策略会不同。比如first-fit 或 best-fito)。
    • 如果刚好找到一块正好与要求相当的,就把它直接返回给调用者
    • 如果找到一块较大的内存,那么将对其进行分割,在将一块大小相当的内存返回给调用者的同时,把较小的那块空闲内存块保留在空闲列表中
    • 如果在空闲内存列表中找不到足够的,那么malloc()调用sbrk()以分配更多的内存。为减少对 sbrk()的调用次数,malloc()并未只是严格按所需字节数来分配内存,而是以更大幅度(以虚拟内存页大小的数倍)来增加 program break,并将超出部分置于空闲内存列表
  • free会将区块重新插入到空闲链表中。

new一个int可以用free释放吗?

你那么写可能对于基本类型是没有问题的,但是一旦设涉及到构造函数与析构函数就不行了,养成习惯是非常重要的,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值