Tag: 堆栈溢出

如何检测到StackOverflowException?

TL; TR 当我提出这个问题时,我认为StackOverflowException是一种防止应用程序无限运行的机制。 这不是真的。 StackOverflowException未被检测到。 当堆栈没有分配更多内存的能力时抛出。 [原始问题:] 这是一个普遍的问题,每种编程语言可能有不同的答案。 我不确定C#以外的语言如何处理堆栈溢出。 我今天遇到exception,并不断思考如何检测到StackOverflowException 。 我相信这是不可能说,如果堆栈是1000电话深,然后抛出exception。 因为也许在某些情况下,正确的逻辑将是那么深。 在我的程序中检测无限循环的逻辑是什么? StackOverflowException类: https://msdn.microsoft.com/de-de/library/system.stackoverflowexception%28v=vs.110%29.aspx 在StackOverflowException类文档中提到的交叉引用: https://msdn.microsoft.com/de-de/library/system.reflection.emit.opcodes.localloc(v=vs.110).aspx 我刚刚添加了stack-overflow标签到这个问题,说明说,当调用堆栈消耗太多的内存时,它正在被抛出。 这是否意味着调用堆栈是我的程序的当前执行位置的某种path,如果它不能存储更多的path信息 ,那么抛出exception?

为什么这个方法会导致无限循环?

我的一个同事向我提出了一个关于这个方法的问题,导致了一个无限循环。 实际的代码有点太过牵扯到这里,但基本上这个问题归结为: private IEnumerable<int> GoNuts(IEnumerable<int> items) { items = items.Select(item => items.First(i => i == item)); return items; } 这应该 (你会认为)是一个非常低效的方式来创build一个列表的副本。 我把它叫做: var foo = GoNuts(new[]{1,2,3,4,5,6}); 结果是一个无限循环。 奇怪。 我认为修改参数在风格上是一件坏事,所以我稍微改变了代码: var foo = items.Select(item => items.First(i => i == item)); return foo; 这工作。 就是这个程序完成了, 没有例外。 更多的实验表明,这也是有效的: items = items.Select(item => items.First(i => i == item)).ToList(); return […]

为什么recursion调用会导致StackOverflow处于不同的堆栈深度?

我试图找出C#编译器如何处理tail调用。 (答案: 他们不是,但是64位的JIT将会执行TCE(tail call elimination)。 所以我使用recursion调用编写了一个小testing,打印了多less次在StackOverflowException进程之前被调用。 class Program { static void Main(string[] args) { Rec(); } static int sz = 0; static Random r = new Random(); static void Rec() { sz++; //uncomment for faster, more imprecise runs //if (sz % 100 == 0) { //some code to keep this method from being inlined var […]

为什么这个语句不会抛出StackOverflowError?

在另一个问题中,我刚刚看到这个奇怪的代码。 我认为这会导致StackOverflowError被抛出,但它不… public class Node { private Object one; private Object two; public static Node NIL = new Node(Node.NIL, Node.NIL); public Node(Object one, Object two) { this.one = one; this.two = two; } } 我以为它会爆炸,因为Node.NIL引用自己构build。 我无法弄清楚为什么没有。

Chrome / jQuery未捕获RangeError:超出最大调用堆栈大小

我在chrome上收到错误“Uncaught RangeError:Maximum call stack size exceeded”。 这里是我的jQueryfunction $('td').click(function () { if ($(this).context.id != null && $(this).context.id != '') { foo($('#docId').val(), $(this).attr('id')); } return false; }); 请注意,页面中有成千上万的单元格。 但是,我通常会将堆栈溢出与recursion联系起来,在这种情况下,就我所见,没有任何溢出。 像这样创build一个lambda会自动生成堆栈上的东西的负载? 有什么办法吗? 目前唯一的解决方法是在渲染HTML时在每个单元格上明确地生成onclick事件,这使HTML变得更大。

为什么有可能从StackOverflowError中恢复?

即使在Java中发生StackOverflowError之后,我仍然可以继续执行,这让我很惊讶。 我知道StackOverflowError是类错误的一个子类。 Error类被解释为“Throwable的一个子类,表示合理的应用程序不应该试图捕捉的严重问题”。 这听起来更像是一个推荐,而不是一个规则,像一个StackOverflowError捕获错误实际上是允许的,这是由程序员的合理性,不这样做。 而且看,我testing了这个代码,它正常结束。 public class Test { public static void main(String[] args) { try { foo(); } catch (StackOverflowError e) { bar(); } System.out.println("normal termination"); } private static void foo() { System.out.println("foo"); foo(); } private static void bar() { System.out.println("bar"); } } 怎么会这样? 我想在StackOverflowError抛出的时候,堆栈应该足够大,以致于没有空间来调用另一个函数。 error handling块是否在不同的堆栈中运行,或者在这里发生了什么?

为什么这个方法打印4?

我想知道当你试图捕获一个StackOverflowError会出现什么情况,并提出了以下方法: class RandomNumberGenerator { static int cnt = 0; public static void main(String[] args) { try { main(args); } catch (StackOverflowError ignore) { System.out.println(cnt++); } } } 现在我的问题: 为什么这个方法打印“4”? 我想也许是因为System.out.println()需要调用堆栈中的3段,但我不知道数字3来自哪里。 在查看System.out.println()的源代码(和字节码)时,通常会导致比3更多的方法调用(因此调用堆栈上的3个段将不够用)。 如果是因为热点虚拟机应用(方法内联)的优化,我想知道在另一个虚拟机上的结果会不同。 编辑 : 由于输出看起来是JVM特有的,我得到了使用的结果 Java(TM)SE运行时环境(build 1.6.0_41-b02) Java HotSpot(TM)64位服务器虚拟机(构build20.14-b01,混合模式) 解释为什么我认为这个问题不同于理解Java堆栈 : 我的问题不是为什么有一个cnt> 0(显然是因为System.out.println()需要堆栈大小,并在打印之前抛出另一个StackOverflowError ),但为什么它有特定的值4,分别为0,3, 8,55或其他系统上的其他东西。

为什么在这里避免堆栈溢出错误#include <string>?

这是我的示例代码: #include <iostream> #include <string> using namespace std; class MyClass { string figName; public: MyClass(const string& s) { figName = s; } const string& getName() const { return figName; } }; ostream& operator<<(ostream& ausgabe, const MyClass& f) { ausgabe << f.getName(); return ausgabe; } int main() { MyClass f1("Hello"); cout << f1; return 0; } […]

什么实际上导致堆栈溢出错误?

我到处寻找,找不到一个坚实的答案。 根据文档,Java在下列情况下抛出java.lang.StackOverflowError错误: 由于应用程序recursion太深而发生堆栈溢出时抛出。 但是这提出了两个问题: 没有其他的方式来发生堆栈溢出,不仅通过recursion? 在JVM实际溢出堆栈之前或之后,StackOverflowError是否发生? 详细解释第二个问题: 当Java抛出StackOverflowError时,你能否安全地认为堆栈没有写入堆中? 如果你缩小了堆栈的大小,或者堆栈溢出的函数的try / catch,你可以继续工作吗? 这是logging在任何地方? 解决scheme我不是在找: 一个StackOverflow发生,因为recursion不好。 StackOverflow在堆满足堆栈时发生。

Try-finally块可以防止StackOverflowError

看看以下两种方法: public static void foo() { try { foo(); } finally { foo(); } } public static void bar() { bar(); } 运行bar()显然会导致一个StackOverflowError ,但运行foo()不(程序似乎无限期运行)。 这是为什么?