在这个模型中,我们将会把一个 C++ 程序在运行的时候所占据的内存空间,分成以下四个部分:
- 堆区(Heap)
- 栈区(Stack)
- 全局静态变量区(Static)
- 常量区(Constant)
在 C++ 程序的内存空间中,
我们在代码中声明的局部变量,以及函数的形式参数,
都保存在栈区中——这部分内存在程序运行的时候会自动分配,而在不需要的时候也会自动释放,并不需要程序员自己去手动维护。
而我们使用new
运算符,或者 C 语言中的malloc
函数进行动态内存分配之后,系统为我们划分的内存空间,就来自于堆区。
因为程序自己并不知道这些动态分配的内存到什么时候会派不上用场,所以程序并不会对这部分已经分配的内存做任何处理。
对于全局变量:静态( static )变量,其保存在内存中的全局/静态区( Global/Static )——全局变量和静态变量是存储在同一块内存空间中的。我们可以简单地认为,程序启动之后,全局/静态变量就保存在这里,而程序结束之后,对应的内存空间将会自动释放。
最后是常量( Constant )区——实际上在实际的程序中并不存在这样一个区域,这里只是为了让大家方便理解。我们可以简单地认为,所有的常量(以const
开头)都存放在一起——这些区域不可释放。
例如
int array[3];
int myFunc(){
int a;
char *p;
char* str="Aloha Oe!";
}
对于这一段代码,我们可以知道,数组array
是全局变量,保存在全局/静态区;函数myFunc
中定义的局部变量a,p,str
都保存在栈区,而"Aloha Oe!"
是一个字符串常量,保存在常量区。
int myFunc2(){
int *p=new int[2];
}
同样进行上面的分析:指针p
是局部变量,建立在栈区,而p
所指向的具有两个元素的数组,作为一个堆对象而位于堆区中。大家这里一定要注意,不要把指针变量跟指针变量所指向的堆对象搞混了。
以上来自计蒜客 :)