1.内存分配方式
内存分配方式有三种:
[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整
个运行期间都存在。例如全局变量, static 变量。
[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数
执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器的指令集中, 效率很高,
但是分配的内存容量有限。
[3] 从堆上分配, 亦称动态内存分配。 程序在运行的时候用 malloc 或 new 申请任意多少
的内存,程序员自己负责在何时用 free 或 delete 释放 内存。动态内存的生存期由程序员决
定,使用非常灵活, 但如果在堆上分配了空间,就有责任回收它, 否则运行的程序会出现内
存泄漏,频繁地分配和释放不同大小 的堆空间将会产生堆内碎块。
2.程序的内存空间
一个程序将操作系统分配给其运行的内存块分为 4 个区域,如下图所示。
一个由 C/C++编译的程序占用的内存分为以下几个部分 ,
1、栈区( stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、
函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
2、堆区( heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由
OS回收 。分配方式类似于链表。
3、全局区(静态区) (static)—存放全局变量、静态数据、常量。程序结束后由系统
释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。
5、程序代码区 —存放函数体(类成员函数和全局函数)的二进制代码。
下面给出例子程序,
int a = 0; // 全局初始化区
char *p1; // 全局未初始化区
int main() {
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; //123456 在常量区, p3 在栈上。
static int c =0;// 全局(静态)初始化区
p1 = new char[10];
p2 = new char[20];
// 分配得来得和字节的区域就在堆区。
strcpy(p1, "123456"); //123456 放在常量区,编译器可能会将它与 p3 所指向的 "123456"
优化成一个地方。
}
3.堆与栈的比较
3.1 申请方式
stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为
b 开辟空间。
heap: 需要程序员自己申请,并指明大小,在 C中 malloc 函数, C++中是 new 运算符。
如 p1 = (char *)malloc(10); p1 = new char[10];
如 p2 = (char *)malloc(10); p2 = new char[20];