内存分配问题(C语言\C++)
C语言
- 栈(编译器自动分配释放)
- 堆(程序员分配释放、程序员不释放则程序结束使可能由OS回收,例如malloc,calloc,realloc)
- 全局、静态区(全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和未初始化的静态变量放在相邻的另一块区域,在函数体外定义的static变量表示在该文件中有效,不能extern到别的文件,函数体内则只在该函数体内有效)
- 存放常量(程序结束释放)
C++
- 栈
- 堆(new分配的内存块,如果未delete则程序结束后操作系统会自动回收)
- 自由存储区(malloc分配,free结束)
- 全局/静态存储区(不区分全局变量是否初始化)
- 常量存储区(存放常量,且正常手段下不允许修改)
浅谈堆栈
- 系统通过专门机器完成栈操作,高效不灵活,支持的数据有限(整型指针浮点数(系统直接支持的数据类型)【系统数据结构,对于进程/线程是唯一的,静态分配(auto)由编译器完成,动态分配由alloc完成,动态分配无效释放,可移植性上考虑,栈的动态分配不被鼓励】
- 程序调用(call指令隐含返回地址入栈,ret子程序弹出返回地址并跳转)
- 自动变量
- 堆不被系统支持,由函数库提供,内存被释放时会进行合并等处理【函数库内部数据结构,不唯一,不同堆分配的内存无法互相操作,堆空间的分配是动态的。】
对象的内存分配
- 局部变量:局部变量分配在栈上
- 全局变量: Person person;自动分配到全局数据段
- 显示地调用malloc则可以通过堆分配
new方法解析(例:p = new Person)基于堆
- 为对象分配内存
- 对象比结构复杂的地方,初始化工作,调用构造函数完成初始化
delete方法解析(例:p = new Person)基于堆
- 先做清除工作,调用destructor析构函数
- 释放内存(free)
基于栈的对象构造
- C++支持,比基于堆的构造函数快