电子产业一站式赋能平台

PCB联盟网

搜索
查看: 72|回复: 0
收起左侧

为什么栈溢出常见,而堆溢出罕见?

[复制链接]

682

主题

682

帖子

2585

积分

三级会员

Rank: 3Rank: 3

积分
2585
发表于 2024-12-27 08:02:00 | 显示全部楼层 |阅读模式

rhstgyydcgb64027939302.gif

rhstgyydcgb64027939302.gif

点击上方蓝色字体,关注我们
栈(Stack)
  • 用途:栈主要用于存储函数调用信息(如函数参数、返回地址和局部变量),遵循后进先出(LIFO)原则。
  • 大小固定:栈的大小通常在程序启动时由操作系统分配,范围较小(通常为几百 KB 到几 MB),因此更容易溢出。
  • 内存分配方式:栈的内存分配和释放由系统自动完成,分配效率高但灵活性差。
  • 存储数据的生命周期短:数据通常在函数结束后即释放。


    堆(Heap)
  • 用途:堆用于动态分配内存,存储生命周期长、大小不确定的数据(如对象、数组)。
  • 大小较大:堆的空间比栈大得多,通常可以达到几 GB,甚至更多,具体大小受系统总内存限制。
  • 内存分配方式:堆的分配和释放由程序员显式控制(如 malloc/free 或 new/delete),更灵活,但容易产生内存泄漏或碎片化。
  • 分配速度较慢:因为需要动态管理内存空间。

    栈溢出更常见是由于:
  • 栈空间较小,分配受限;
  • 栈的内存管理隐式且自动化,程序员可能无意中过度使用;
  • 递归和大局部变量常导致栈的快速耗尽;
  • 栈溢出的触发没有缓冲机制,直接导致程序崩溃。
    [/ol]

    堆溢出较少见是由于:
  • 堆空间更大,且堆分配失败有保护措施;
  • 堆分配是显式控制,开发者可以主动检查和限制;
  • 现代操作系统和语言运行时对堆内存的保护机制较完善。
    [/ol]

    1
    栈溢出的常见原因
    栈溢出的根本原因是程序对栈的使用超出了其分配的大小。

    以下是主要触发情况:
    递归函数调用过深

    每次递归调用会在栈中分配新的栈帧。如果递归未正确终止,可能导致栈空间耗尽。

  • void recursive() {   recursive();}[/ol]
    局部变量过大

    在栈上分配的局部数组或对象大小超出栈的容量。
  • void largeArray() {    int arr[1000000]; // 数组太大}[/ol]
    在一些嵌入式系统中,栈的默认大小可能只有几十 KB,更容易溢出。
    2
    堆溢出的罕见性
    相比栈溢出,堆溢出更少见。其原因如下:
  • 堆空间更大:堆空间通常是栈空间的数百倍甚至数千倍。即使程序错误分配了大量内存,系统也可能延迟触发错误。
  • 堆分配失败机制:动态内存分配失败时,程序通常会收到 NULL 指针或异常信号,程序员可检查并处理,而不是立即触发溢出。
  • int* ptr = (int*)malloc(1e9 * sizeof(int));
    if (ptr == NULL) {    printf("Memory allocation failed.
    ");}
    操作系统会对堆内存分配进行一定限制(如虚拟内存分页机制),防止超出可用物理内存。

    大多数编程语言(如 Java 和 Python)通过垃圾回收(GC)避免无意义的堆增长。
    [/ol]
    3
    堆溢出的可能场景
    尽管堆溢出较少见,但并非完全不会发生。如果程序请求的内存超过系统可用内存,则可能引发溢出。

  • while (1) {    malloc(1e9); // 无限分配}
    程序未正确释放动态分配的内存,导致堆空间耗尽,无法继续分配新内存。

  • while (1) {    int* ptr = (int*)malloc(1024);    // 未调用 free(ptr)}
    堆中存在大量小块未使用的碎片,尽管总空闲内存足够,但无法找到连续的大块可用空间,导致分配失败。

    [/ol]理解两者的区别和原因,能够帮助开发者更好地编写高效、安全的程序,同时避免常见的内存问题。

    f2001rc0zdz64027939402.jpg

    f2001rc0zdz64027939402.jpg

    wp1a4o5osqf64027939502.gif

    wp1a4o5osqf64027939502.gif

    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表