Advertisement

C基础语法:栈区的内存由系统自动分配与回收,无需人工管理;堆区的内存空间成员(必须在定义变量时进行初始化),未正确初始化会导致许多问题.需要使用malloc()进行手动分配,并使用free()进行手动回收.

阅读量:

一、概述

栈是一种由编译器在程序运行过程中根据需求动态分配的存储区域,当不再需要时会自动进行清理。该区域中存储的变量多为局部变量以及函数调用时传递的参数。

堆则是通过malloc()函数(在C++语言中使用new运算符)进行内存分配的区域,其内存释放需由程序员手动操作。在C语言中,释放堆内存需调用free()函数(C++中则使用delete操作符)。

栈与堆之间存在以下几方面的差异:

管理机制存在差异。
栈的管理完全由编译器负责,无需人工干预;而堆空间的申请和释放则需要程序员自行完成,若处理不当容易引发内存泄漏问题。

容量规模不同。

复制代码
* 栈结构是向低地址方向扩展的连续内存区域。其最大容量及栈顶地址由系统预先设定,一旦申请的空间超过剩余容量,则会触发溢出错误。因此,用户能够获取到的栈空间相对有限。
* 堆结构则是向高地址方向扩展的非连续内存区域。由于系统采用链表方式记录空闲内存块,并按照从低到高的顺序遍历链表,因此堆能够提供的空间更加灵活且更大。此外,在栈结构中不存在某个元素从中间弹出的情况。

碎片化问题。

复制代码
* 在堆中频繁执行malloc/free(或new/delete)操作会导致内存碎片化现象的发生,从而影响程序运行效率(尽管操作系统会在程序退出后回收所有内存)。
* 而在栈结构中,则不会出现此类碎片问题。

扩展方

全部评论 (0)

还没有任何评论哟~