典型C内存空间分布图
下图是一个典型的C内存空间分布图
这是Linux下32位环境的用户空间内存分布情况
内核空间 :一部分核心软件独立于普通应用程序,运行在较高的特权级别上,驻留在被保护的内存空间上,拥有访问硬件设备的所有权限
内存栈区 :存放函数的参数值,局部变量的值等,在程序运行时由编译器自动分配。
内存堆区 :存放new或者malloc出来的对象。如main函数里面定义的。
全局静态区 : 存放全局变量,局部静态(static)变量和全局静态变量,初始化的全局变量和静态变量data段,为初始化的全局变量和静态变量放在bss段。
常量区 :存放一般常量和字符串常量
代码区 :存放二进制代码,只读,可共享
C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄露,使用free和delete销毁new和malloc申请的堆内存,而栈内存时动态释放。
#include <iostream>
using namespace std;
int arr[10]; //数组未初始化,空间开辟在bss段上
int arr2[10] = {1,2,3,4,5,6,7,8,9,10}; //数组已初始化,空间开辟在data段
int main()
{
int arr3[10]; //空间开辟在栈上面
int a = 10; //空间开辟在栈上面
int *p = new int[10]; //空间开辟在堆上面
static int data; //未初始化静态变量,空间开辟在bss段上
static int data2 = 100;//初始化静态变量,空间开辟在data段上
return 0;
}