内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局
区[C++][内存管理]
一. 在 c 中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区
域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
在函数体中定义的变量通常是在栈上,用 malloc, calloc, realloc 等分配内存的函数分配得到的就是在
堆上。在所有函数体外定义的是全局量,加了 static 修饰符后不管在哪里都存放在全局区(静态区),在
所有函数体外定义的 static 变量表示在该文件中有效,不能 extern 到别的文件用,在函数体内定义的
static 表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如:
inta=0;//全局初始化区
char*p1;//全局未初始化区
voidmain()
{
intb;//栈
chars[]="abc";//栈
char*p2;//栈
char*p3="123456";//123456{post.content}在常量区,p3 在栈上
staticintc=0;//全局(静态)初始化区
p1=(char*)malloc(10);//分配得来得 10 字节的区域在堆区
p2=(char*)malloc(20);//分配得来得 20 字节的区域在堆区
strcpy(p1,"123456");
//123456{post.content}放在常量区,编译器可能会将它与 p3 所指向的"123456"优化成一块
}
二.在 C++中,内存分成 5 个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常
是局部变量、函数参数等。