详解C/C++内存区域划分(简而易懂)

C语言在内存中一共分为如下几个区域,分别是: 1 内存栈区: 存放局部变量名; 2 内存堆区: 存放new或者malloc出来的对象; 3 常数区: 存放

C语言在内存中一共分为如下几个区域,分别是:

1. 内存栈区: 存放局部变量名;
2. 内存堆区: 存放new或者malloc出来的对象;
3. 常数区: 存放局部变量或者全局变量的值;
4. 静态区: 用于存放全局变量或者静态变量;
5. 代码区:二进制代码。
知道如上一些内存分配机制,有助于我们理解指针的概念。

C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。

C/C++内存区域划分详解

C/C++内存分布

在这里插入图片描述

C/C++中,内存主要分为、堆、栈、全局/静态存储区和常量存储区。

栈:栈又叫堆栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等,是向下增长的。所谓向下生长的就是,先调用的栈帧的地址比后调用的地址大,栈一般大小有几个M左右。

#include<iostream>
using namespace std;

void f2()
{
	int b = 0;
	cout << "b:" << &b << endl;
}
void f1()
{
	int a = 0;
	cout <<"a:" <<&a << endl;

	f2();
}
int main()
{
	f1();
	return 0;
}

在这里插入图片描述

堆:就是那些由new/malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new/malloc就要对应一个delete/free,由程序员主动释放。堆是可以上增长的.意思是先建立的堆的地址小于后建立的堆的地址。

#include<iostream>
using namespace std;

int main()
{
	void* p1 = malloc(10);
	void* p2 = malloc(10);

	cout << p1 << endl;
	cout << p2 << endl;

	return 0;
}

在这里插入图片描述

数据段:存储全局数据和静态数据。
代码段:可执行的代码/只读常量

知道了内存分布,下面就来做题吧,考验知识的时候到了,看看会做几题吧

在这里插入图片描述

是不是前几题还得心应手,后面就有点懵了

在这里插入图片描述
在这里插入图片描述

栈和堆的区别:

栈:由编译器自动分配并且释放,一般存储函数的参数局部变量等
堆:由程序员分配释放,若程不释放则系统释放

1、申请内存方式
栈:由系统自动分配,如变量的声明的同时会开辟空间,(int a; 开辟4个字节的空间)(静态指定)

堆:由程序员申请,需要制定大小(动态分配)
2、系统响应的不同

栈:只要剩余空间大于申请内存,系统就会提供,否则会栈溢出

堆:便历空闲地址链表,找到符合要求的,就删除该地址分配给程序,内存的首地址记录分配的大小,(方便delete)多余的内存回收

3、空间大小不同
栈:连续的,编译时就确定的常数
堆:不连续,他的上限决定于系统中有效的虚拟内存
4、执行效率的不同
栈:由系统分配,速度快
堆:程序员分配,速度慢,容易产生内存碎片,不过用起来方便

到此这篇关于C/C++内存区域划分详解的文章就介绍到这了,更多相关C++内存划分内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!