c++之new/malloc联系与区别

之前写过c/c++程序的内存结构(二),里边有使用new分配内存空间的具体过程。即

示例:A *a=new A;a->i=10;在内核中的内存分配上发生了什么?
1、A *a:a是一个局部变量,类型为指针,故操作系统在程序栈区开辟4/8字节的空间(0x000m),分配给指针a
2、new A :通过new动态的在堆区申请类A大小的空间(0x000n)
3、a=new A:将指针a的内存区域填入栈中类A申请到的地址的地址。即*(0x000m)=0x000n (堆与栈建立了联系)
4、a->i:先找到指针a的地址0x000m,通过a的值0x000n和i在类a中的偏移offset,得到a->i的地址0x000n+offset,进行*(0x000n+offset)=10的赋值操作,即内存0x000n+offset的值是10.

下面是malloc的具体使用:

在这里插入图片描述

一、联系
1、首先,malloc和new申请的都是虚拟内存
2、malloc函数的实质,有一个将可用的内存块连接起来的链表,调用malloc的时候,会沿着链表找一个满足用户需求的内存块。然后将这个内存块一分为二,一块和用户所申请的内存大小相同,另一块返回到链表中。如果用户申请一个大的内存块,空闲链表上可能没有可以满足用户要求的片段,这个时候malloc函数就会请求延时,对链表上的内存进行整理。如果还是不可以的话, 内存申请失败,返回NULL
3、new的话,底层实现还是malloc,在分配失败的时候会抛出bad_alloc类型的异常

二、区别
1、申请的内存所在位置

new操作符从自由存储区(free store)上为对象动态分配内存空间。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。
malloc函数从堆上动态分配内存。堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

2、返回类型安全性不同

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

3、内存分配失败时的返回值不同

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL。
malloc分配内存失败时返回NULL。

4、是否需要指定内存大小不同

使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。
malloc则需要显式地指出所需内存的尺寸。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值