new / delete与malloc / free的异同及实现原理

本文详细探讨了C++中new和delete的实现原理,以及它们与malloc/free的区别。new/delete作为C++的运算符,支持重载,自动计算内存大小和类型安全,而malloc/free是C/C++标准库函数,需要手动计算大小且不支持对象构造与析构。此外,文章还讨论了delete与delete[]的使用场景,malloc/free与new/delete的内存释放问题,以及malloc与free的底层实现机制。
摘要由CSDN通过智能技术生成


前言

早餐店的老板问我要点什么,我说我要肆意妄为,志得意满,要梨花带雨和人见人爱,开个玩笑,我已经长大了,我要两根油条和一份豆浆。


一、new和delete是如何实现的?

new的实现过程是:
1、new简单类型直接调用operator new分配内存;

2、对于复杂结构:首先调用名为operator new的标准库函数,分配内存,接下来调用该类型对象的构造函数,最后返回指向新分配并构造后的对象的指针

3、对于简单类型,new[]计算好大小后调用operator new;

4、对于复杂数据结构,new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小n,然后调用n次构造函数,针对复杂类型,new[]会额外存储数组大小;

delete的实现过程:
1、delete简单数据类型默认只是调用free函数;复杂数据类型先调用析构函数再调用operator delete 释放该对象所占内存;

2、针对简单类型,delete和delete[]等同。假设指针p指向new[]分配的内存。因为要4字节存储数组大小,实际分配的内存地址为[p-4],系统记录的也是这个地址。delete[]实际释放的就是p-4指向的内存。而delete会直接释放p指向的内存,这个内存根本没有被系统记录,所以会崩溃。

3、需要在new []一个对象数组时,需要保存数组的维度,C++的做法是在分配数组空间时多分配了4个字节的大小,专门保存数组的大小,在delete []时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值