Skip to content

【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’)

    定义后,在程序结束前都存在,不会随作用域的结而结束(如用于函数中调用时可使用上次的计算结果)

    该变量不能被其他文件引用

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1