C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、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++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new)的文章就介绍到这了,更多相关C++ 内存分区模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new))