C++的程序内存模型——四区

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的程序内存模型——四区相关的知识,希望对你有一定的参考价值。

目录标题

应用场景

为什么说这个呢因为在之前Java的编程中肥学遇到了,在自定义的函数体中的局部变量想要输出的情况,熟悉Java的大佬可能都知道,这样做的方法使用最多的就是直接返回return然后再去接收,恰好当时我的返回值又不能是这个值所以当时我就被迫创建了一个静态变量。后来有大佬告诉我可以放在类里面也就是new这样也能带出来,当时试了试确实可以,但是不知道为什么。今天来还愿,解决一下这是为什么。但是用的C++解释的。

代码运行前的两个区

这个比较好理解我就不多介绍了

/*
程序运行前有两个区域
代码区:存放函数体的二进制,由操作系统管理,代码区共享,只读
全局区:全局变量、静态变量、常量。该区在程序结束后由操作系统释放
*/

代码运行后的两个区


/*
程序运行后的两个区域
栈区:由编译器自动分配释放,存放函数的参数值和局部变量但是不要放回局部变量,因为编译器会自动释放掉它
堆区:由程序员管理,结束时系统自动释放
*/

栈区


//栈区
int* stackArea() 
	int a = 100;//局部变量,存放在栈区,战区的数据在函数执行完后自动释放

	return &a;//返回局部变量的地址




int main() 
	int* p = stackArea();


	cout << *p << endl;//第一次可以打印是因为编译器做了保留
	cout << *p << endl;//第二次的时候数据以经被释放了

	return 0;


堆区

还愿部分

//堆区
int* heapArea() 
	//new开辟的数据内存在堆区
	//p其实还是局部变量数据栈区但是存储了堆区数据
	int* p = new int(10);
	return p;




int main() 
	int* p = heapArea();


	cout << *p << endl;
	cout << *p << endl;//两次结果都一样是10

	return 0;


以上是关于C++的程序内存模型——四区的主要内容,如果未能解决你的问题,请参考以下文章

C++的程序内存模型——四区

C++的程序内存模型

内存四区模型

内存四区模型

C++核心编程之-内存分区模型

黑马视频笔记:C++程序的内存模型