动态内存管理

1.C++中为什么要更新动态内存的管理方式

C语言管理内存的方式在C++中还是可以用的,绝大部分语言是具有包容性的。C++中提出了自己的内存管理方式:通过new和delete操作符进行内存管理;

更新管理方式是因为针对内置类型C和C++的管理方式没有区别,针对自定义类型的时候,malloc和free只管开空间和调用析构函数。new和delete会进行开空间,调构造函数,调析构函数
在这里插入图片描述

2.new与delete

2.1使用方法

1.申请和释放单个元素空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]。千万不能混用,否则会造成程序崩溃。
在这里插入图片描述
2.用new申请自定义类型空间的时候,如果不是默认的构造函数,调用的时候要自己传值,并且不可以申请连续的空间
在这里插入图片描述
在这里插入图片描述

2.2原理

2.2.1内置类型

如果申请的是内置类型的空间,new和malloc,delete和free是类似的,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL;

2.2.2自定义类型

new的原理:
1.调用operator new函数申请空间
2.在申请的空间上执行构造函数,完成对象的构造

delete原理:
1.在空间上执行析构函数完成对象中资源的清理工作
2.调用operator delete函数释放对象的空间

new[]原理:
1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成对N个对象空间的申请
2.在申请的空间上执行N此构造函数

delete[]原理:
1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

3.operator new和operator delete函数

1.是什么

operator new和operator delete函数是C++申请和释放内存的库函数,不是new和delete的重载,用法与malloc/free是一样的

2.为什么需要

C语言处理错误的方式一般是返回错误码,malloc返回零;
C++(面向对象)的处理方式为抛异常,operator new处理错误的方式就是抛异常;
operator new可以清晰的知道错误在哪里,malloc则需要自己去查找
在这里插入图片描述

3.怎么用

实际中并不会单独使用operator new,它的存在意义是给new调用的

operator new <=> malloc +malloc失败抛异常(其实operator new 和 operator delect 的底层就是通过malloc和free来实现的)
new <=> operator new +构造函数(new失败也是需要抛异常的,因此new需要调用operator new)
在这里插入图片描述

delete<=> 析构函数+operator delete (先调用析构函数,因为如果先释放了,就无法清理对象内部的资源了)
operator delect <=> free (operator delect存在的意义是为了匹配operator new,因为释放空间是不会失败的)
在这里插入图片描述

4.operator new与operator delete的类专属重载

当我们需要对一个类进行频繁的申请空间的时候(比如链表),对操作系统的干扰会增加,效率也会降低,为了提升效率出现了池化技术;
即申请的时候给一块内存,减少频繁申请,这种叫做内存池。类似的还有进程池、线程池、连接池都可以减少调用,减轻对操作系统的负担;
在这里插入图片描述

5.定位new

5.1是什么

定位new表达式数在已分配的原始内存空间中调用构造函数初始化一个对象,因为构造函数不可以显示的调用(构造函数是定义对象的时候自动调用完成初始化的),所以需要借助定位new来进行初始化(析构函数可以显示调用)

5.2使用格式

new(place_address)type或者new(place_address)type(initializer-list)
place_address必须是一个指针,initialzer-list是类型的初始化列表

5.3使用场景模拟

定位new一般是配合内存池使用。因为内存池分配出来的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化
在这里插入图片描述

6.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会在申请空间后调用构造函数完成对象的初始化,和释放空间前调用析构函数完成空间资源的清理

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值