C/C++中栈内存、堆内存的二三事

1,245 阅读2分钟

参考

c++中堆、栈内存分配

内容

一个由C/C++编译程序占用内存分为以下几个部分 (之前我们在《C语言存储类别、链接与内存管理,你真的都会了吗》中有接触:自动区、静态区、动态区) 1、栈区(stack,自动内存)— 由编译器自动分配释放 ,存放函数参数值,局部变量值等。 2、堆区(heap,动态内存) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 3、全局区(静态区)(static)—,全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 未初始化全局变量和未初始化静态变量在相邻另一块区域。 - 程序结束后由系统释放。-->分别是data区,bbs区  4、文字常量区 —常量字符串就是放在这里。 程序结束后由系统释放-->coment区 5、程序代码区—存放函数体二进制代码。-->code区

示例:

#include <string>
int a=0;    //全局初始化区
char *p1;   //全局未初始化区
void 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\0"优化成一个地方。
}

内存分配方式有三种:

1.从静态存储区域分配。内存在程序编译时候就已经分配好,这块内存在程序整个运行期间都存在。例如全局变量,static变量。

2.在栈上创建。在执行函数时,函数内局部变量存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。

3.从堆上分配,亦称动态内存分配。程序在运行时候用malloc或new申请任意多少内存,程序员自己负责在何时用free或delete释放内存。动态内存生存期由我们决定,使用非常灵活,但问题也最多。

一般所说堆栈(stack)往往是指栈,先进后出,它是一块内存区。用以存放程序局部变量,临时变量,函数参数,返回地址等。在这块区域中变量分配和释放由系统自动进行。不需要用户参与。

而在堆(heap,先进先出)上空间则是由用户进行分配,并由用户负责释放。