1. new
new int
new int[10]
new Stash
--分配int大小(4字节)的内存空间
--分配10个int大小(40字节)的内存空间
--分配类需要的空间,注意定义类(哪怕是动态的)的时候会自动调用构造函数
--返回分配的地址 int *p=new int;
--有一个数据链表会记录申请空间的地址与大小
2. delete
delete p;
delete[] p;
--收回空间
--类的对象,先析构,再收回空间
--[]表明会回收数组的整个空间(如果是类的数组,则析构整个类的数组)
--根据上述的数据链表来收回相应的空间
3. 为什么new后要delete?
防止内存(堆)泄漏。
4. C语言可执行代码结构
代码段 | 可执行代码、字符串常量 |
数据段 | 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据 |
BSS段 | 未初始化全局变量,未初始化全局静态变量 |
栈 | 局部变量、函数参数 |
堆 | 动态内存分配 |
--分页分段机制:划分程序页、数据页;一页可分为若干段;
--程序页中包括代码段,数据页中包括数据段、BSS段、栈段、堆段;
--在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间;
--栈段亦由操作系统分配和管理,而不需要程序员显示地管理,生命周期为函数执行期间;
--堆段由程序员自己管理,即动态地申请和释放空间。
5. 内存数据分配
静态存储区域:
--编译的时候分配,在整个程序运行期间都存在,主要存放静态数据、全局static数据和常量;
--数据区的大小由系统限定,一般很大。
栈(堆栈、进程栈):
--主要存放函数的参数以及局部变量;
--栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理;
--栈是向低地址扩展的数据结构,是一块连续的内存的区域,申请的空间超过栈的剩余空间时则overflow;
--整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为1M/2M。
堆:
--动态内存分配,C中的malloc、free或者C++中的new、delete;
--一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收;
--堆是向高地址扩展的(跟数据结构中的堆是两回事),是不连续的内存区域。系统用链表来存储空闲内存地址,链表的遍历方向是由低地址向高地址;
--堆的大小受限于计算机系统中有效的虚拟内存,可用的空间比较大。