在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/delete 与 malloc/free 不能混用,因为 new 和 delete 会自动调用类、结构的构造函数和析构函数。
2、数组的分配与释放
new 类型; // n表示数组的长度,会自动调用n次构造函数
delete[] 指针; //通过new[] 分配的内存,必须通过delete[]释放
new[ ] 返回值前4个字节中存放数组的长度
3、重复释放
delete/delete[ ] 不能重复释放同一块内存
delete/delete[ ] 释放野指针的后果不确定,但释放空指针是安全的
4、内存分配失败
当分配的内存过大,没有能满足需求的整块内存,就会抛出异常。
异常:std::bad_alloc