2021-01-26 打卡学习C++第六天


一、内存分区模型

C++程序在执行时,将内存大方向划分为4个区域

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

  • 全局区:存放全局变量和静态变量及常量

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

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

==内存四区意义:==不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

1、程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

  • 存放了CPU执行的机器指令

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

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

全局区:

  • 全局变量静态变量存放在此

  • 全局区还包含了常量区,字符串常量和其他常量也存放在此

  • 特点:该区域的数据在程序结束后由操作系统释放

全局变量和局部变量在内存中分布在不同的内存区域段

全局变量就是不放在函数中的变量

静态变量就是在普通变量前加static

全局变量、静态变量、字符串常量、全局常量(const修饰的全局常量)都存放在全局区

局部变量、局部常量(const修饰的局部变量)都不在全局区

示例

#include<iostream>
using namespace std;

//全局变量
int g_a = 10;
int g_b = 20;

//全局常量
const int c_g_a = 10;
const int c_g_b = 20;

int main()
{
    
    
	//局部变量
	int a = 10;
	int b = 20;
	cout << "局部变量a的存放地址" << (int)&a << endl;
	cout << "局部变量b的存放地址" << (int)&b << endl;

	//局部常量
	const int c_a = 10;
	const int c_b = 20;
	cout << "局部常量c_a的存放地址" << (int)&c_a << endl;
	cout << "局部变量c_b的存放地址" << (int)&c_b << endl;

	//全局变量
	cout << "全局变量g_a的存放地址" << (int)&g_a << endl;
	cout << "全局变量g_b的存放地址" << (int)&g_b << endl;

	//全局常量
	cout << "全局常量c_g_a的存放地址" << (int)&c_g_a << endl;
	cout << "全局常量c_g_b的存放地址" << (int)&c_g_b << endl;



	//静态变量
	static int s_a = 10;
	static int s_b = 20;
	cout << "静态变量s_a的存放地址" << (int)&s_a << endl;
	cout << "静态变量s_b的存放地址" << (int)&s_b << endl;

	//字符串常量
	cout << "字符串常量的存放地址" << (int) &"hello world" << endl;



	system("pause");
	return 0;

}

输出结果
在这里插入图片描述

2、程序运行后

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

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

局部变量、形参数据存放在栈区,栈区的数据在函数执行后自动释放

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

new操作符:
在C++中主要利用new在堆区开辟内存
堆区开辟的数据,由程序员动手开辟,手动释放,释放利用操作符delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针

#include<iostream>
using namespace std;

int *func()
{
    
    
	int * p = new int(10);
	return p;
}

void test01()
{
    
    
	int * p = func();
	cout << *p << endl;
	cout << *p << endl;
	//堆区的数据不会自动释放,需要程序员操作
	//如果想释放堆区的数据,利用关键字delete
	delete p;
}

void test02()
{
    
    
	//在堆区创建整型数据的数组,含有10个元素
	int *arr = new int[10];

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

int main()
{
    
    
	test01();
	
	system("pause");
	return 0;

}

【注释】 学习课程为-黑马程序C++教程

猜你喜欢

转载自blog.csdn.net/qq_42616280/article/details/113193140