c++中malloc和new对比

15 篇文章 1 订阅

使用malloc和new是由于为了节约内存,很多数据都是动态生成的。

1.malloc函数
如下是分配长度为100个字节的内存块,返回值为void* ,表示未确定类型的指针。因此往往需要加上强制转换,如下所示,malloc和free一起使用。

char *p;

p=(char *)malloc(100); //分配成功则返回分配后内存空间的首地址,不成功则返回空指针null

1.1malloc函数实现原理:

1)malloc 函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。

2)调用 malloc(n)函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。 然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。

3)调用 free 函数时,它将用户释放的内存块连接到空闲链表上。

4)到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段, 那么空闲链表上可能没有可以满足用户要求的片段了。于是,malloc()函数请求延时,并开始在空闲链表上检查各内存片段,对它们进行内存整理,将相邻的小空闲块合并成较大的内存块。


1.2为什么会大于请求长度n是由于:需要内存对齐

如某个机器的整型长度为4个字节且它的起始存储位置能够被4整除,那么结构体


struct  ALLGN {
        char    a;
        int     b;
        char    c;
};

实际申请内存大小要为4的整数倍,因此该结构体所占大小为12字节,实际只使用到6个字节

内存对齐详见:https://blog.csdn.net/misskissc/article/details/14647845

2.new函数

和上述一样也是动态分配堆内存,new和/delete一起使用

new用法


    //开辟单地址空间
    int *p = new int;  //开辟大小为sizeof(int)空间
    int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。
    //开辟数组空间
    //一维
    int *a = new int[100]{0};//开辟大小为100的整型数组空间,并初始化为0。
    //二维
    int (*a)[6] = new int[5][6];
    //三维
    int (*a)[5][6] = new int[3][5][6]

delete用法


    //释放单个int空间
    int *a = new int;
    delete a;
    //释放int数组空间
    int *b = new int[5];

3.malloc/free和new/delete的区别

(1)属性

malloc/free是C/C++库函数,需要头文件支持。new/delete是关键字,需要编译器支持。

(2)内存区域

new/delete不仅会分配内存,还会自动调用构造和析构函数,而malloc和free只会分配内存。

(3)参数

new申请无需指定内存大小,而malloc需指定内存

(4)返回类型不一样

new返回的是对象类型的指针,如int *p = new int;返回的就是一个int型指针。

而malloc返回的是*void,即无类型的指针,需做强制性转化,见上第一个例子。

(5)重载

C++允许重载new/delete操作符,malloc不允许重载

(6)分配失败

new分配失败,会爆出bac_alloc异常,malloc分配异常返回null

(7)内存泄漏

内存泄漏对于new/delete都能检测出来,而new可以指明是文件的哪一行。而malloc不可以。

 

Reference :

https://blog.csdn.net/nyist_zxp/article/details/80810742

https://blog.csdn.net/damage233/article/details/81116115

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与国已互相成为双方最大的交易伙伴。国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占国外贸总值的15.4%。在过去20余年,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值