C++中内存区域的划分

栈存储区

那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆存储区(*存储区)

那些由new或者malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。这种变量的存储区域是在变化的。

全局/静态存储区

全局变量以及静态变量(static)存储的区域

常量存储区

这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

还要说明的一点是常变量和普通变量对应的内存分配是一样的,只不过系统会对该变量进行“保护”,不让它被改变。

通过一个程序来说明:

#include<cstdio>
#include<cstdlib>
using namespace std;
int b=0;
int main()
{
	int a1=0;
	const int a2=1;
	static int b1=0;
	const	static int b2=0;
	char *c="123";
	char *d="2234"; 
	int *p1=new int;
	int *p2=(int *)malloc(sizeof(int));
	printf("栈区域:\n%d\n%d\n",&a1,&a2);
	printf("堆区域:\n%d\n%d\n",p1,p2);
	printf("全局\静态变量存储区:\n%d\n%d\n%d\n",&b,&b1,&b2);	
	printf("常量存储区:\n%d\n%d\n",&c[0],&d[0]);
	return 0; 
}

结果输出:

栈区域:
2293404
2293400
堆区域:
6054168
6054184
全局静态变量存储区
4337696
4337700
4325472
常量存储区:
4325376
4325380

通过多次运行可以发现,堆区的地址是在不断变化的……


C++中内存区域的划分

上一篇:Oracle之查询(1)


下一篇:Python标准库之urllib,urllib2自定义Opener