C++内存管理——空间申请、释放的新玩法

malloc free与new delete的不同

1.底层原理上的差异

malloc 只是在堆上开辟空间(以字节为单位),free配合malloc进行空间的释放
new针对自定义类型,会先调用operator new进行开辟空间,再使用自定义类型的构造函数进行初始化(operator new的用法跟malloc是一样的,功能上都是在堆上开空间
delete针对自定义类型,会先使用该自定义类型的析构函数进行清理,在调用operator delate进行空间的释放
因为上述底层上的原理差异,所以如果是申请内置类型对象或数组,使用malloc和new并没什么区别。而自定义类型,则差别很大

2.申请失败时了处理方式不同

使用malloc申请失败了则返回NULL;
使用new申请失败后会抛异常(从 申请失败处往后不再执行后面的程序,直接跳转到catch(捕获异常)处)

/*malloc的使用*/
ListNode* p=(ListNode*)malloc(sizeof(ListNode));
/*free的使用*/
free p;
/*单一对象new的使用*/
ListNode* p=new ListNode(1);
//在底层为operator new +ListNode的构造函数
//相当于malloc+ListNode的构造函数+失败抛异常机制
/*delete的使用*/
delete p;
/*数组对象new的使用*/
ListNode* p=new ListNode[3]{0,1,2};
//{}中的初始化可以省略,省略后直接调用构造函数进行初始化
/*数组对象delete的使用*/
delete []p;

特殊情况:定位new
new(p)ListNode;也可以加参数:new(p)ListNode(3);
/针对p这块空间调用ListNode的构造函数初始化。/
定位new表达式在实际中一般是配合内存池调用。因为池化分配出来的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

思考一下:malloc/new最大能申请多大空间?
如何malloc出4G的空间?
答案会在C++内存管理(二)中公布,链接:查看答案就点这里哦

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值