【7】内存分区模型 
目录
C++程序在执行时,将内存大方向划分为 4 个区域,不同区域存放的数据,赋予不同的生命周期
- 代码区:存放函数体的二进制代码,由操作系统进行管理的 
- 全局区:存放全局变量和静态变量以及常量(字符串常量和其他常量) - 使用范围:从定义位置开始到原件结束 - 在局部变量作用域内,同名全局变量不起作用 
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量,局部常量等 
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 
- 可用输出地址的方式发现储存地址的不同 
程序运行前
在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域
- 代码区:
 存放 CPU 执行的机器指令
 代码区是共享的,对于频繁被执行的程序,只需要在内存中有一份代码即可
 代码区是只读的,防止程序意外地修改了它的指令
- 全局区:该区域的数据在程序结束后由操作系统释放 - 程序运行后 
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 
 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
c
int * func()
{
	int a = 10;
	return &a;
}
int main() {
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
	system("pause");
	return 0;
}- 堆区:由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
c
int* func()
{
	int* a = new int(10);
	return a;
}
int main() {
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
	system("pause");
	return 0;
}7.3 空间的开辟与释放 
- 释放的空间不可访问
malloc 函数(C) & free 函数(C) 
c
void *malloc(unsigned int size);
malloc(100); 	//开辟100字节零临时分配区域,返回第一个字节的地址
				//未执行成功返回空类型指针
void free (viod *p);
free(p);//释放指针p所指向的动态空间,p应为最近一次调用calloc 或maloc时得到的函数返回值new(C++) & delete(C++) 
c
new int; //开辟一个存放整数的存储空间,返回地址
            //返回一个指向该存储空间的地址(即指针)
new int(100); //开辟一个存放整数的空间,并指定该整数的
            //初值为100,返回一个指向该存储空间的地址
new char[10];//开辟一个存放字符数组(包括10个元素)
            //的空间,返回首元素的地址
new int[5][4];//开辟一个存放二维整型数组(大小为5*4)
            //的空间,返回首元素的地址
float *p=new float(3.14159);
//开辟一个存放单精度数的空间并指定该实数的初值为3.14159,
//将返回的该空间的地址赋给指针变量p
//创建失败返回NULL指针
delete[] arr;//释放数组 delete 后加 []7.4 储存类型 
- auto(默认型) - 有动态生存期 
- register - 和 auto 类似,不过存在寄存器中,速度更快//仅作为编译建议,非强制性 
- extern - 可引用在其他文件中声明的全局变量,一般不用,容易出错(声明后即可使用外部文件中的变量) 
 也可以用 extern 声明后提前引用下文中的全局变量
 是声明不是定义
- static - 静态类型,默认值为 0 或空字符(‘\0’) - 定义后,在程序结束前都存在,不会随作用域的结而结束(如用于函数中调用时可使用上次的计算结果) - 该变量不能被其他文件引用 
