变量
C++ 程序中的内存分为5个部分:
- 1、堆:这是程序中未使用的内存,在程序运行时可用于动态分配内;即由new分配的内存块。他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
堆变量:全局变量、静态变量、new变量产生的变量都在堆中,动态分配的变量在堆中分配;
- 2、栈:那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区;
栈变量:在函数内部声明的所有变量都将占用栈内存;里面的变量通常是局部变量、函数参数等。
-
3、自由存储区:是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的;
-
4、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
-
5、常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改;
很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。
在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即 new 运算符。
如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。
int a; // a在文件中声明是 全局变量,是堆变量
void func(int arg) // arg是函数参数,是栈变量
{
static int b; // b虽然在函数内声明,但是静态的,所以也在全局数据区,是堆变量
int c; // c 是函数内声明,是栈变量
void *p; // p 是函数内声明,是栈变量
p = (void *)malloc(100); // p指向的空间用malloc分配,是堆空间
}
内存
一个由C/C++编译的程序占用的内存分为以下几个部分
- 1、栈区(stack) : 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 ;
- 2、堆区(heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表;
- 3、全局区(静态区)(static) :全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放
- 4、文字常量区 :常量字符串就是放在这里的。程序结束后由系统释放;
- 5、程序代码区 :存放函数体的二进制代码;
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}