【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’)
定义后,在程序结束前都存在,不会随作用域的结而结束(如用于函数中调用时可使用上次的计算结果)
该变量不能被其他文件引用