最近看了看C++内存的这一块内容,就做一个简短的总结吧。

C++内存分配有三种方式:

  1. 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  2. 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  3. 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

C++程序编译时内存分为5大存储区:

  1. 栈区(stack),编译器自动分配释放,主要存放函数的参数值,局部变量值等。
  2. 堆区(heap),由程序员分配释放(new和delete)。
  3. 自由存储区,由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  4. 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,存放全局变量和静态变量,程序结束时由系统释放,分为全局初始化区和全局未初始化区。
  5. 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改,程序结束时由系统释放。

以一句代码来看堆和栈的区别,之前总结过堆栈的区别,但有时候一行代码更能说明问题:

void test(){
    int* p = new int[10];
}

首先 new分配了一块堆内存,而指针 p它是在栈上分配的。总而言之,就是在栈内存中存放了一个指向一块堆内存的指针 p。在程序会先确定在堆中分配内存的大小,然后调用 operator new 分配内存,然后返回这块内存的首地址,放入栈中。

堆栈分配方式的区别:

堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 malloc 函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。