malloc与new的区别

4 篇文章 0 订阅

【背景介绍】

前段时间参加腾讯面试,面试官让我说说malloc与new的区别;当时一下懵逼了,当时想到的只有new是C++的,在申请内存的时候应该会调用new的构造函数进行申请内存与初始化;以及new对应的是释放是delete。malloc对应的是C语言中的内存申请函数,其他更多的就不知道了。查询资料发现new和malloc的差别比较多,根据在网上查询到的资料进行总结。主要参考博客:https://www.linuxidc.com/Linux/2016-01/127591.htm

【正文】

1、new是操作符,malloc为库函数。

2、存储位置差异:

      2.1 new操作符从自由存储区上为对象动态分配内存空间,自由存储区分配的内存可以是堆上也可以是静态存储区域;通过delete释放分配的空间。

     2.2 malloc为库函数,分配的内存在操作系统的堆上;必须通过free函数进行释放。

3、返回类型差异性:

     3.1 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换;如果内存分配失败,抛出bac_alloc异常,它不会返回NULL。所以在堆new申请的内存进行判断时,不能判断new返回的结果是否为NULL。

     3.2 malloc函数分配成功时,返回值为void *,需要根据需要进行类型转换;如果内存分配失败,返回NULL。

4、是否需要指定分配内存大小

    4.1 new会根据类型信息进行自行计算,从而在分配内存时不需要指定大小

    4.2 malloc函数在进行内存分配时,需要指定分配内存的大小;

5、是否需要调用构造函数

    5.1 new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构;

   其中,new操作符分配内存主要分为以下三步骤:

   第一步:调用operator new函数分配足够的空间;

   第二步:通过编译器调用对应的构造函数来进行初始化;

   第三步:返回指向该对象的指针。

   并在使用delete操作符释放对象时,首先调用对象的析构函数,再调用operator delete函数释放空间。

   5.2 malloc/free不会调用构造函数/析构函数

6、是否可以直观分配内存

    6.1 使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。

    6.2 new没有这样直观的配套设施来扩充内存。

7、new操作符具有操作符重载等特性,而malloc不具有该特性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值