内存分配方式:堆,栈,自由存储区,全局区,常量存储区
栈:函数内部的局部变量,函数形参等,自动创建自动释放
堆:由new delete运算符创建和释放,或者程序结束后os自动回收
自由存储区:标准库函数malloc分配的空间
全局区:全局变量和静态变量存储的区域
常量存储区:存常量,此区域数据不允许被修改,一些字符串常量等放在这里
堆和栈的区别:
(1)管理方式
堆:用户动态创建,用户释放,忘记释放会产生内存泄漏
栈:自动释放
(2)空间大小
堆:空间大:4G(32位系统)
栈:空间小(VC下约为1MB)
(3)碎片问题
堆:频繁的new/delete会造成内存空间的不连续,从而产生大量碎片,使得程序效率低
栈:无内存碎片问题
(4)生长方向
堆:向上,内存增加的方向
栈:向下,内存减少的方向
(5)分配方式
堆:动态分配
栈:动态和静态分配(静态为编译器完成)
(6)分配效率
栈的分配效率要高,因为计算机底层提供对栈的支持,分配专门的寄存器存放栈的地址,专门的指令对栈进行操作
堆的使用规则要注意:
(1)用new或者malloc动态分配内存后要检查是否为空,检查内存是否分配成功,防止使用内存地址为空的地址指针
(2)不要忘记为数组和动态内存赋初值,避免未被初始化的内存做右值
(3)避免数组,指针的下标越界
(4)new/delete,malloc/free要成对使用,防止内存泄漏,且使用delete和free之后要把指针设为空(NULL)防止野指针的存在
野指针产生的原因:
1
、指针变量没有被初始化
;
2
、指针被
free/delete
后被没有设置为
NULL;
3
、指针操作超越了变量的作用域范围
.