第63章:new和delete

63.1 介绍new和delete

new 的作用类似 malloc / calloc /  realloc,反正就是用来申请内存的

delete 的作用类似 free,反正就是用来释放内存的

63.2 如何使用new和delete

63.2.1 申请单个内存

      首先,用的时候,用上 using namespace std 命名空间,比如我们要 new 一些值,那么我们就可以去申请,申请有不同的的情况

      第一种情况:申请单个的内存(单个内存是最简单的),new 就是申请,假设我们 new 一个 int 类型大小的内存,即:new int,申请出来也是返回个指针,所以我们用一个 int 类型的指针接收一下,然后我们就可以在 *p 里边存一些数据,比如:int * p = 69,如图所示:

63.2.2 申请单个内存且初始化

      除此之外,也可以申请单内存的同时且初始化,现在我们要用一个指针去接收,所以我们写一个 int * p2 = new int(999),解释一下此代码:用 p2去 new 一个 int 类型,后边跟一个圆括号,圆括号里边写初值,当然我们也可以用 double 等,类型自己挑

      如果我们输出 cout << "*p2 =" << *p2 << endl,我们会发现:输出的值直接就是圆括号里边的值,这就叫做申请的同时,给了它一个初值,如图所示:

63.2.3 批量申请

      第1种写法和第2种写法,其实是同一种,只不过1没有给初值,是 *p1在赋值,而2是申请的同时,就给了初值

      批量申请当然就是批发,批量申请也是属于连续的内存,假设我们用一个 int 类型的指针 p3接收一下,我们去 new int,要多少个取决于中括号,所以我们就申请了10个 int 类型的空间,然后用一个 for 循环,即:for(i = 0; i <10; i++),如图所示:

      批量申请,连续内存就不能够给它初值了,因为没地方写了,第2步给初值是要放到后边,用圆括号给一个初值,但是第3步是连续的,中括号里边已经指定了我们要多少个了(要10个 int),所以 int 就没有地方再给初值了,因此,连续的内存,是不能申请的同时再初始化的,只能指定长度,然后后续再赋值初始化

      delete 的时候,直接 delete p1就可以了。同理,p2也是属于当个的内存,所以也是 delete p2,只能释放一个

      p3就不能只释放一个了,因为 delete1和 delete2的写法只能释放1个,那我们要释放 p3对应的这一连续的一段怎么弄?p3用的是中括号,所以我们就在 delete 后边也加一个中括号就行了,如图所示:

      值得注意的是:释放的时候,连续一段内存一定要加上一个[]释放,因为加上[]就会从 p3所存储的首地址开始,一直向后释放到申请的时候做了标记的地方

      什么意思?我们在第15行代码要申请10个 int 类型大小的内存,申请出来的首地址存在 p3里边,然后在10个 int(40个 byte)结束的时候,会做一个我们不知道的标记,然后释放的时候,我们要释放 p3,那么就会从 p3开始,只要我们加了[],就表示要连续释放,释放到前面申请的时候,做标记的地方为止

      因此,使用 delete 的时候,如果要释放连续一段内存,就需要加上[ ],只要释放一个,那就不用加[]了

      当然,delete 连续释放的时候,它是从当前位置开始,向后释放到标记。所以当我们释放的时候,特别是连续释放的时候,[]后边的指针(比如 p3)必须是首地址,否则就会有一部分释放失败,因为只能向后开始,往标记的那一段释放

      画一个图,比如我们申请了这么一段内存,我们的标记是在末尾位置的,然后是放的时候,本来是要从起始地址开始,一直到标记之间的一整段都释放掉,那就全释放了,但是,如果指针不是首地址,那么此时释放的就只有右边这一段,那确实是成功释放了,但是它前面的这一段没有释放,所以必须是首地址,如图所示:

补充:

1. new 和 delete 都是关键字,new 是分配内存的,去申请;delete 是释放内存的,去归还

2. 初始化用圆括号,指定型号用中括号

3. new 就是申请,向堆区申请

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值