C++ 内存分区模型

发布于:2023-01-04 ⋅ 阅读:(281) ⋅ 点赞:(0)

目录

内存分区模型

内存分区的意义

代码区域与全局区

栈区

堆区

1.在堆区创建整型数据并释放

2.在堆区创建整型数据类型的数组


内存分区模型

C++执行程序时,将内存分为四个区域:

        1.代码区:存放函数体的二进制代码,由操作系统进行管理。

        2.全局区:存放全局变量、静态变量和常量

        3.栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。

        4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存分区的意义

        不同区域存放的数据赋予不同的生命周期,使得编程更灵活。

代码区域与全局区

在程序编译后,生成了exe可执行程序,未执行该程序前分为代码区全局区

代码区:

        存放CPU执行的机器指令。

        代码区时共享的,共享的目的是对于频繁被执行的程序,只需要内存中有一份代码即可。

        代码区是只读的,使其只读的原因是防止程序意外的修改了它的指令。

全局区:

        全局变量和静态变量存放在此。

        全局区还包含了常量区、字符串常量和其它常量。

        该区域的数据在程序结束后由操作系统释放。

如下代码说明了全局变量和局部变量存放在内存中的不同区域中:

#include <iostream>
using namespace std;
#include <string>

//创建普通的全局变量
int globa_a = 10;
int globa_b = 10;

int main()
{
	//创建普通的局部变量
	int a = 10;
	int b = 10;
	cout << "局部变量a的地址为:" << (int)&a << endl;
	cout << "局部变量b的地址为:" << (int)&b << endl;

	cout << "全局变量a的地址为:" << (int)&globa_a << endl;
	cout << "全局变量b的地址为:" << (int)&globa_b << endl;
}

结果:

栈区

由编译器自动分配释放,存放函数的参数值局部变量等。

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。

#include <iostream>
using namespace std;


int* func()
{
	int a = 10;  //局部变量  存放在栈区,栈区的数据在函数执行完后自动释放
	return &a;  //返回局部变量的地址
}

int main()
{
	int * p = func();  //接收func函数的返回值,用指针指向a的地址
	cout << *p << endl;
	cout << *p << endl;
}

结果:

 发现两次打印的不一样

第一次能正确打印是因为编译器做了保留,第二次就不再保留了。

堆区

 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

在C++中主要用new在堆区开辟内存,手动释放使用delete操作符

1.在堆区创建整型数据并释放

#include <iostream>
using namespace std;
#include <string>

int * func()
{
	int * p = new int(10);  //在堆区开辟一块内存
	return p;  //返回这块内存地址
}

int main()
{
	//在堆区开辟数据
	int *p1 = func();
	cout << *p1 << endl;
	
	//释放堆区的数据
	delete p1;

}

结果:

2.在堆区创建整型数据类型的数组

#include <iostream>
using namespace std;
#include <string>

int main()
{
	int * arr = new int[10];  //在堆区创建包含有10个整型数据的数组
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
	}

	delete[] arr;  //释放堆区数组
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到