0803C++内存分区模型

137 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

1.1 前言

程序在执行时,内存划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量静态变量以及全局常量
  • 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量局部常量
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

1.2代码区

作用: 存放 CPU 执行的机器指令

特点:

    1. 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
    1. 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

1.3 全局区

作用: 存放全局变量和全局常量、静态变量. ​特点: 该区域的数据在程序结束后由操作系统释放.

#include<iostream>
#include<string>
using namespace std;
 
//全局变量
string q_a = "Mona";
//全局常量
const string q_c_a = "Mona";
int main() {
    int a  = 10;//局部变量 
    const int j_a = 10;//局部常量
	static int s_a = 10; 
	cout << "全局变量地址为: " << (int)&q_a << endl;
	cout << "全局常量地址为: " << (int)&q_c_a << endl;
	
	cout << "局部变量地址为: " << (int)&a << endl;
	cout << "局部常量地址为: " << (int)&j_a << endl;

	cout << "静态变量地址为: " <<  (int)&s_a << endl;
	system("pause");

	return 0;
}

输出:

全局变量地址为: 4792356
全局常量地址为: 4792364
局部变量地址为: 7208588
局部常量地址为: 7208584
静态变量地址为: 4726788
请按任意键继续. . .

注意:

  • 由输出可以看出全局变量常量静态变量都在同一个区,即全局区。
  • (int)&b将b的地址转换成十进制。

1.4 栈区(程序运行后)

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

// int*,返回值的数据类型是地址变量
int * funa()
{
	int a = 1;
	return &a;
}
int main() {
	int *b = funb();
	cout << *b << endl;
	cout << *b << endl;
	system("pause");
	return 0;
}

结论: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

1.5 堆区(程序运行后)

作用: 由程序员分配和手动释放,若程序员不释放,程序结束时由操作系统回收 使用: 主要利用new在堆区开辟内存数据。堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete

int* func()
{
   //开辟一个内容为1的指针
	int* a = new int(1);
	return a;
}
int main() {

	int *a = funa();

	cout << *a << endl;
	cout << *a << endl;

	//利用delete释放堆区数据
	delete a;

	//cout << *a << endl; //报错,已释放,不可访问

	system("pause");

	return 0;
}

注意: 利用new创建的数据,会返回该数据对应的类型的指针

  • 同时也可以用它开辟一个数组
int main() {
     //创建一个10个浮点型的数组,在堆区
	float* a = new float[10];

	for (int i = 0; i < 10; i++)
	{
		a[i] = i + 1.5;
	}

	for (int i = 0; i < 10; i++)
	{
		cout << a[i] <<" " ;
	}
	//释放数组 delete 后加 []
	delete[] a;

	system("pause");

	return 0;
}

输出:

1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 请按任意键继续. . .