C++中的内存管理

在C++中内存主要分为5个存储区:

栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配和释放.栈属于计算机系统的数据结构,进栈出栈有相应的计算机指令支持,而且分配专门的寄存器存储栈的地址,效率分高,内存空间是连续的,但栈的内存空间有限。

堆(Heap):需要程序员手动分配和释放(new,delete),属于动态分配方式。内存空间几乎没有限制,内存空间不连续,因此会产生内存碎片。操作系统有一个记录空间内存的链表,当收到内存申请时遍历链表,找到第一个空间大于申请空间的堆节点,将该节点分配给程序,并将该节点从链表中删除。一般,系统会在该内存空间的首地址处记录本次分配的内存大小,用于delete释放该内存空间。

全局/静态存储区:全局变量,静态变量分配到该区,到程序结束时自动释放,包括DATA段(全局初始化区)与BBS段(全局未初始化段)。其中,初始化的全局变量和静态变量存放在DATA段,未初始化的全局变量和静态变量存放在BBS段。BBS段特点:在程序执行前BBS段自动清零,所以未初始化的全局变量和静态变量在程序执行前已经成为0.

文字常量区:存放常量,而且不允许修改。程序结束后由系统释放。

程序代码区:存放程序的二进制代码

这篇主要讲的是 new/delete 这两个运算符

1、new/delete  在C++ 中具备申请/释放堆内存功能的运算符,相当于C语言中的malloc和free。

使用方法:

int* p = new 类型

new 类型:会自动计算类型所需要的字节数,然后从堆中分配对应字节数的内存,返回内存的首地址(具备类型的地址)。

delete 指针

会自动释放堆内存。

注意:new/deletemalloc/free 不能混用,因为 newdelete 会自动调用类、结构的构造函数和析构函数。

2、数组的分配与释放

new 类型;  // n表示数组的长度,会自动调用n次构造函数
delete[] 指针;  //通过new[]  分配的内存,必须通过delete[]释放

new[ ] 返回值前4个字节中存放数组的长度

3、重复释放

delete/delete[ ] 不能重复释放同一块内存
delete/delete[ ]  释放野指针的后果不确定,但释放空指针是安全的

4、内存分配失败

当分配的内存过大,没有能满足需求的整块内存,就会抛出异常。
            异常:std::bad_alloc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值