【问题标题】:Why having a stackoverflow exception before the function is even executed?为什么在函数执行之前出现 stackoverflow 异常?
【发布时间】:2016-09-06 09:39:30
【问题描述】:

我编写了覆盖对象 Equals 的代码。 我意识到,在我写完之后,我将有 StackOverFlowException,因为我还没有实现 IEquatable 接口来处理最后一行代码。然而,我运行代码看看会发生什么,并且发生了一些奇怪的事情,您可以在下图中自己看到:

此时断点甚至无法命中,似乎代码甚至在我的程序运行之前就已被使用。它是由 CLR 完成的吗?是别的吗?

感谢您的帮助!

【问题讨论】:

  • 你的刹车点永远不会被击中。它内部是白色的(不是红色并且上面有警告),因此代码与正在运行的问题不匹配。重建您的解决方案。
  • 你实现IEquatable<T>接口了吗?
  • 看看这个可能会有所帮助recursive depth
  • @Dovydas Sopa - 这不是问题,这是在构建之后。
  • @Alessandro D'Andria - 是的,你是对的,修复了它。谢谢

标签: c# stack-overflow


【解决方案1】:

堆栈已用尽(压死骆驼的最后一根稻草)

  if (ReferenceEquals(right, null))

可能堆栈没有另外 4 (8) 个字节来存储 right。 真正的原因似乎在

  return Equals(right as Quality)

如果rightQuality类型,代码注定要一次又一次调用Equals

【讨论】:

  • 我知道递归部分在哪里,可以通过该行旁边的标记显示。这不是我的问题。问题是为什么错过了断点。我希望即使它是一个无限递归函数,我也会在第一次调用 Equals 时遇到断点。
  • @Moti Berger:堆栈正在消耗,在某些时候,它终于耗尽:堆栈无法再分配 4/8 字节。最后一击可能发生在某个随机/奇怪的点
  • 我知道在无限递归调用堆栈中最终会耗尽,但是为了发生耗尽,函数的代码必须至少运行一次,所以为什么没有命中断点。有些东西,不是我的代码,必须在我的代码运行之前使用 Quality 类型的 Equals 函数!我的问题是谁使用了该功能。程序在启动前就崩溃了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多