zoukankan      html  css  js  c++  java
  • 从一次意外的堆栈溢出异常说开来 (一)

    今天有一个朋友告诉我他的程序发生了StackOverFlowException

    可是查来查去不知道为什么,就一段递归代码几个人阅读过似乎都没有问题

    以下是简化版的代码 (真实的代码复杂很多,不过大意如下)

            static void Test(int i)
    {
    if (i > 20000)//或者其他退出条件
    {
    return;
    }
    Test(i + 1);
    }

    static void Main()
    {
    Test(0);
    }


    呵呵,大家能看出有什么问题么? 提示:逻辑上没有任何问题,也别在找什么语法错误

    看起来逻辑是:这段代码没有死循环,20000次就退出嘛,

    可是在实际运行中会抛出StackOverFlowException异常,

    其原因是由于递CLR中默认堆栈大小是1M,

    此程序不断的递归,每一级递归的方法都被压入了堆栈,当堆栈大小达到1M的时候,StackOverFlowException就抛出了

    在我的机器上i运行到15918的时候抛出了堆栈溢出

    大家可能觉得 要递归10000多次呢,看起来应该不会有什么问题吧

    其实只要不小心,小几百次的递归就会出异常。

    稍后演示这种情况。。。

  • 相关阅读:
    OpenLDAP备份和恢复
    OpenLDAP搭建部署
    Python正则表达式
    ansible学习
    Jenkins学习
    docker学习2
    让阿里告诉你, iOS开发者为什么要学 Flutter !
    用UIKit和UIView在视图上执行iOS动画
    iOS开发如何面对疫情过后的面试高峰期 !
    如何写好一个UITableView
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2186596.html
Copyright © 2011-2022 走看看