C++内存管理

内存分配机制

内存分为五个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

  1. 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  2. 堆,通过new等去堆上申请空间,编译器不会给我们释放,由我们去控制,一个new对应一个delete或者是new []对应一个delete[],若是不去主动释放,会造成内存泄漏
  3. 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  4. 全局/静态存储区(数据段),全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  5. 常量存储区(代码段),这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
  • 注意:
    A.malloc、calloc申请出的空间,要立即检查指针值是否为NULL,用assert接口对指针判断
    B.new在空间申请失败时会抛异常

new和delete的原理

内置类型:
若申请的是内置类型的空间,new和malloc,delete和free基本相似。new/delete 申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间。new在空间申请失败时会抛异常,malloc申请空间失败则返回NULL。
自定义类型:
new:
调用operator new函数申请空间。在申请的空间调用构造函数,完成对象的构造。比malloc多了一个调用的构造函数。
delete:
在空间上调用析构函数,完成对象中资源清理的工作。调用operator delete函数释放对象的空间。
new arr[N]:
调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。在申请的空间上执行N次构造函数。
delete [ ]:
在释放的空间上执行N次析构函数,完成N个对象中资源的清理。 调用operator delete[]释放空间,在operator delete[]中调用operator delete来释放空间。

new 和 delete 要匹配使用

  • 当malloc或者calloc后,释放时应使用free来释放,即new, new[]也应该用delete,delete[]来释放

那为什么使用 new 的时候要用 delete,使用 new[] 的时候又要用 delete[]。

String* ptr = new String[10];

通过new创建10个String对象,调用delete 进行p的内存释放时,加上了"[]"目的是为了告诉编译器,"你"在释放的是对象数组,然后编译在背后会调换用十次析构函数
new[]出来的并不是仅仅只有10个String对象,还会存储string对象的个数,会使ptr会多出一段空间,若是直接用delete或者是free,会直接释放掉ptr的所有的空间,然而储存的数量的空间并不能释放,若是释放编译器会报错

在这里插入图片描述

malloc/free和new/delete的区别

1.相同点:它们都是堆上申请空间并且手动释放。(C++中,自由存储区与堆不作区分)
2.malloc和free是函数,new和delete是操作符,new和delete都封装了malloc和free
3.malloc申请的空间不初始化,new申请的空间可以初始化。
4.malloc申请空间时需要计算所需空间的大小并且传递,new申请空间时只需在其后加上空间类型即可。
5.malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟的是空间的类型。
6.malloc申请空间失败时返回NULL,使用时需要判空,而new不需要判空,但是new需要捕获异常。
7.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数和析构函数处理空间,但new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前后调用析构函数完成空间中资源的清理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值