C++内存
C++内存管理——内存分类
MoaKap
在编写程序过程中,程序员必须清楚程序内存的分配机制,合理进行内存管理,这样才能得到高效的程序。同时,如果对C++内存分配基本概念不理解,使用不当,一方面浪费了宝贵的内存资源,降低了程序运行效率,另一方面还会造成程序中意想不到的错误。
在C++程序中,把内存分为4类,程序存储区、静态数据存储区、运行时栈、自由存储区或堆:
1、 程序存储区
包含所有函数及成员函数的机器指令。函数一旦被编译,即被编译为特定得机器指令,存放在程序存储区。当程序运行时,从内从中读取并执行指令。
这部分内存不允许更改,在一般情况下,指针不会指向内存代码段中的位置。但也有特殊,如指向函数的指针,其指向即为程序存储区存放该函数的机器指令的位置。
2、 静态数据存储区
此段存放所有的全局变量,以及由static修饰符声明的任意局部变量、或类数据成员。
其中全局变量是指在函数或类作用域之外定义的变量,通过赋值或构造函数初始化。在main函数开始执行之前,完成对全局变量的初始化。
像全局变量一样,static定义的变量同样只需分配一次内存,而且要在main开始执行之前对其进行初始化,且每个名字只能分配一个值。之后该变量将一直存在直到运行结束。
3、 运行时栈
运行时栈是指程序运行时使用的栈,使用栈来保存程序运行过程中的一些系统指针。
例如,调用函数时存储参数和返回地址的指针。当要调用函数时,程序先将这返回地址指针压栈,然后程序跳转至调用函数执行,函数返回后从栈中弹出位置指针找到调用函数前的位置,以便继续执行接下来的指令。
运行时栈还用来为函数中的参数、局部变量分配内存,待函数返回时从栈中释放内存,允许下一次函数调用重用该内存块。
运行时栈可以实现内存的重用,增加了内存使用效率,但使用栈存储局部变量有两个主要缺点:
A、 栈内存值的生存期取决于函数的开始和结束。即函数返回时,栈中的值就不存在了。因此,任何返回局部变量地址的操作都是不允许的。
B、 栈为局部变量分配内存时,必须已知变量要占用的内存空间的大小。
4、 自由存储区或堆
在不能预知对象大小的情况下,就不能使用栈内存。例如在不知道数组包含的元素数的情况下,就不能使用栈未数组分配内存。
此时,就需要动态存储分配。
堆(自由存储区)存储由运算符new显式申请空间的大小。
vector也是在堆中进行分配的。
例如: 在函数中有 Employee * boss = new Employee(”Lin, Lisa”,68000);
上面的语句声明了存储在栈中的名为boss的指针变量。指针的值指向存储在堆中的数据域。其中boss变量存放在栈空间中,指针指向的数据则存放在堆中。