C++ 内存分区模型(代码区、全局区、栈区、堆区、new)

内存分区模型

  • 1 代码区
  • 2 全局区
  • 3 栈区
  • 4 堆区
  • 5 new运算符

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第1张图片

1 代码区

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第2张图片

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第3张图片

2 全局区

// 全局变量、静态变量、常量
C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第4张图片

#include 
using namespace std;

// 全局变量、静态变量、常量

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

//const修饰的全局常量
const int c_g_a = 10;
const int c_g_b = 10;

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

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第5张图片
C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第6张图片
总结
C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第7张图片

3 栈区

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第8张图片
//栈区注意事项
//不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放

#include 
using namespace std;

//栈区注意事项
//不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放

int *func(int b)//形参数据也存放在栈区
{
	b = 100;
	int a = 10;//局部变量:存放在栈区,栈区的数据在函数执行完毕自动释放
	return &a;//返回局部变量的地址
}
int main()
{
	//接受func函数的返回值
	int *p=func(1);
	cout << *p << endl;//第一次可以打印正确的数字,因为编译做了一次保留
	cout << *p << endl;//第二次,就没了,输出乱码

	system("pause");
	return 0;
}

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第9张图片

4 堆区

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第10张图片

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第11张图片

#include 
using namespace std;
int *func()
{
	//利用new关键字,将数据开辟到堆区
	//指针本质也是局部变量,存放在栈上,指针保存的数据存放咋堆区
	int* p = new int(10);
	return p;
}
int main()
{
	//在堆区开辟数据
	int* q = func();
	cout << *q << endl;//与上一个程序对比,多输出几次
	cout << *q << endl;
	cout << *q << endl; 
	cout << *q << endl;

	system("pause");
	return 0;
}

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第12张图片

5 new运算符

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第13张图片

#include 
using namespace std;

//1.new的基本语法
int* func()
{
	//在堆区创建整形数据
	//new返回的是数据类型指针
	int* p = new int(10);
	return p;
}
//2.在堆区利用new 开辟数组
int main()
{
	//在堆区开辟数据
	int* q = func();
	cout << *q << endl;//与上一个程序对比,多输出几次
	cout << *q << endl;
	cout << *q << endl;

	//堆区数据是由程序员管理开辟、管理释放
	//如果想释放堆区数据,利用关键字delete
	delete q;
	cout << *q << endl;//内存已被释放,再次访问就是非法操作,报错

	system("pause");
	return 0;
}

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第14张图片C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第15张图片

#include 
using namespace std;

//1.new的基本语法


//2.在堆区利用new 开辟数组
void test()
{
	//创建10整形数据的数组,在堆区
	int *arr =new int[10];//10代表数组有10个元素

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;//给10个元素赋值,100~109
	}
	for (int i = 0; i < 10; i++)
		cout << arr[i] << endl;

	//释放堆取数组
	//释放数组的时候,要加[]才可以,否则认为是只是放一个元素
	delete[] arr;
}
int main()
{
	test();
	system("pause");
	return 0;
}

C++ 内存分区模型(代码区、全局区、栈区、堆区、new)_第16张图片
注意:
释放堆取数组
释放数组的时候,要加[]才可以,否则认为是只是放一个元素

参考:
哔哩哔哩 黑马程序员

你可能感兴趣的:(C++,c++,内存管理)