C++内存管理new-delete大法及实现原理

目录

前言:

一:C语言中区域划分的回顾及各个变量存在的位置

1.经典例题

​编辑2.C/C++中内存区域的划分 

二:C++内存管理方式  new delete操作符

1.对于内置类型

2.对于自定义类型 

三:operator new和operator delete函数 

1.new和delete的底层实现原理

2.new 和delete对内置类型和自定义类型处理的底层原理

1.对于内置类型

2.对于自定义类型

1.new的原理

2.delete的原理

3.new[N]的原理

4.delete[]的原理

四:定位new表达式(placement-new)

1.概念

五:malloc/free和new/delete的区别 

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

前言:

在C/C++中,对于要开辟和释放动态的内存空间,在C语言中常常使用malloc,calloc,realloc,free四大函数来完成,而在C++中就会使用new和delete来完成动态内存空间的申请释放,而C++兼容C语言所以也可以使用四大函数,但注意free和delete不能混着用,尽量匹配使用的

一:C语言中区域划分的回顾及各个变量存在的位置

1.经典例题

2.C/C++中内存区域的划分 

二:C++内存管理方式  new delete操作符

1.对于内置类型

我们可以发现对于malloc和new申请的空间都不会完成初始化,所以对于内置类型new和malloc差不多,那么在C中要想完成初始化的话,就得使用calloc函数,C++中也可以完成初始化 

开辟多个并初始化 

2.对于自定义类型 

三:operator new和operator delete函数 

1.new和delete的底层实现原理

1.new和delete是用户用来动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,而new在底层是调用operator new全局函数来实现动态申请空间的,delete在底层是调用operator delete 全局函数来实现动态内存空间的释放的

2.operator new全局函数:该函数实际是通过malloc来申请空间的,当malloc申请空间成功时直接返回;申请失败时抛异常

3.operator delete全局函数是通过free来释放空间的

2.new 和delete对内置类型和自定义类型处理的底层原理

1.对于内置类型

malloc free和 new delete基本相同,不同的是 new delete申请和释放的是单个元素的空间,new[],delete[]申请的是一块连续的空间,new失败时抛异常,而malloc失败时返回NULL

2.对于自定义类型
1.new的原理

       1.调用operator new函数申请空间

       2.在申请空间时自动调用构造函数

2.delete的原理

1.调用operator delete函数释放对象的空间

2.在空间上执行析构函数,完成对象中资源的清理工作

3.new[N]的原理

1.调用operator new[]函数,在operator new[]函数中调用N次operator new函数完成N个对象空间的申请

2.在申请的空间上执行N次构造函数

4.delete[]的原理

1.在释放的对象上调用执行N次析构函数,完成N个对象中的资源清理工作

2..调用operator delete[]函数,在operator delete[]函数中调用N次operator delete函数完成N个对象空间的释放

四:定位new表达式(placement-new)

1.概念

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

定位new表达式在实际中一般是配合内存池使用的,内存池的内存是由操作系统的对上申请的,内存池分配的内存没有初始化 ,如果是自定义类型就可以使用定位new表达式调用构造函数初始化

五:malloc/free和new/delete的区别 

共同点:都是从堆上申请空间,并且需要用户手动释放

不同点:

1.malloc /free是函数,new/delete是操作符

2.malloc申请的空间不会初始化,new可以初始化

3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象的个数即可

4.malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟的是空间的类型

5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值