new与malloc

在C++中我们申请动态内存的时候,主要我们会用到一个是malloc,另一个就是new,这两个都可以给我们申请空间所用,那有什么区别呢?
1. 申请内存的位置
new是从自由存储区(free stort)上为对象动态分配来内存,而malloc是从堆上动态分配内存,说到这又要知道自由存储区和堆,自由存储区指的是使用new申请到的内存空间,而堆是操作系统的术语,是操作系统所维护的一块特殊内存,用于动态内存分配。
自由存储区是否是堆?这个问题就要看operator new的实现原理了,其实它的底层就是通过malloc来申请内存空间的。
2.返回类型的安全性
new返回的是完整类型指针,而malloc返回的是void*类型的,需要强制类型转换成我们需要的类型。
3.内存分配失败的返回值
new内存分配失败时,会抛出bac_alloc异常,malloc分配失败时会返回一个NULL,所以用malloc分配时一般是要检查空间是否分配成功。
4.分配内存的大小
使用new时编译器会自动计算类型信息大小,所以不用指定内存块的大小,而malloc则需要显示的指出所需内存大小。
5.处理数组
C++提供new[]和delete[]来专门处理数组类型,而malloc则是给你一块原始的内存,不知道也不想知道你要在这里放数组还是其他什么。
6.对已分配内存进行扩充
使用malloc分配的内存当我们发现内存不足需要扩充内存时,可以使用realloc函数进行内存重新分配实现扩充。
realloc:如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
7.是否相互调用
new底层其实还是用malloc实现动态内存分配的,所以new调用malloc,malloc不会调用new。
8.客户处理分配内存不足情况
new抛出异常之前,它会调用一个用户指定的错误处理函数new_handle,
malloc只会返回一个NULL。
9.函数重载
new可以重载
malloc不行
10. 调用构造与析构
使用new时分配内存时:
1)调用operator new函数分配一块足够大,未初始化的内存空间。
2)编译器电泳构造函数对构造对象,初始化。
3)然后返回一个指向对象的指针。
mallo则不会。
malloc申请的内存空间则需要我们自己进行初始化。
下面是new申请空间的步骤:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值