C++内存分配情况
C++内存分配是C++编程中的一個重要概念,它涉及到内存的管理和分配。在C++中,内存分成五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。每个区的特点和使用场景都不同,了解这些区的区别和特点对编程非常重要。
一、栈
栈是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。栈的管理方式是由编译器自动管理,无需手工控制。例如,声明在函数中一个局部变量 int b;系统自动在栈中为 b 开辟空间。
二、堆
堆是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制。一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。例如,void f() { int* p=new int[5]; },这条语句在栈内存中存放了一个指向一块堆内存的指针 p。
三、自由存储区
自由存储区,就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。
四、全局/静态存储区
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的,在 C++里面没有这个区分了,他们共同占用同一块内存区。
五、常量存储区
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然你要通过非正当手段也可以修改,而且方法很多)。
六、堆和栈的区别
堆和栈的主要区别有六点:
1、管理方式不同;栈是由编译器自动管理,而堆需要程序员自己申请,并指明大小,释放工作由程序员控制。
2、申请大小的限制和生长方向;栈的大小是有限的,例如在 WINDOWS 下,栈的大小是 2M,而堆的大小可以达到 4G 的空间。
3、能否产生碎片不同;堆可能产生碎片,而栈不容易产生碎片。
4、分配方式不同;栈的分配方式是编译器自动分配,而堆的分配方式是程序员自己申请。
5、分配效率不同;栈的分配效率高于堆。
6、能否释放不同;栈的释放是自动的,而堆的释放需要程序员自己控制。
七、释放内存
释放内存是非常重要的,否则可能会产生内存泄露。例如,在上面的例子中,我们需要使用 delete []p 来释放内存,而不是 delete p。