进程空间的内存分配
从高地址到低地址如图所示:
名称 | |
---|---|
操作系统内核区 | 用户不可见 |
用户栈 | 栈指针,向下扩展 |
动态堆 | 向上扩展 |
全局区(静态区) | .data初始化.bss未初始化 |
文字常量区(只读数据) | 常量字符串 |
程序代码区 | 栈指针,向下扩展 |
下面详细介绍这几个区域:
1.栈区:
- 由编译器自动分配释放,速度较快
- 程序在编译期对变量,返回地址,参数和函数分配内存都在栈上进行,函数运行结束,这些局部变量等空间都会被释放
- 程序运行过程中函数调用时参数的传递也在栈上进行,如递归调用栈
- 当栈过多的时候,就是导致栈溢出(比如大量的递归调用或者大量的内存分配)
- 栈是向低地址扩展的数据结构,是一块连续的内存的区域,空间有限
2. 堆区:
- 由程序员分配(new,malloc)释放(delete,free),并指明大小,速度较慢
- 若程序员不释放,导致内存泄漏,new完没有delete
- 不过在整个程序结束时由操作系统