为什么堆栈溢出在Visual C++中没有错误?

qaz*_*qaz 4 c++ stack-overflow

在Microsoft Visual C++ 2010中,我创建了一个程序,该程序可能会导致堆栈溢出.当我使用"开始调试"运行程序时,发生堆栈溢出时会引发错误.当我使用"start without debugging"运行它时,不会抛出任何错误,程序只是静默终止,就像它已成功完成一样.有人可以向我解释发生了什么事吗?还有其他任何编译器不会在堆栈溢出时抛出错误吗?

(我认为这是提出有关堆栈溢出的问题的正确位置.)

Tam*_*lei 9

C++不会像托管环境那样牵着你的手.堆栈溢出意味着未定义的行为.

  • @qaz你应该编写的代码首先不会导致堆栈溢出. (11认同)
  • @qaz:无论是否有SEH,都无法处理C和C++中的堆栈溢出.即使您在溢出堆栈时捕获了SEH异常(或者您使用任何其他特定于平台的机制来检测SO),此时您的程序基本上已经完全搞砸了.试图继续做*任何事情*可以释放你的鼻子恶魔. (3认同)
  • @slacker:除非你的系统在实际溢出堆栈之前抛出了堆栈溢出通知 - 在这种情况下你可以抛出一个C++异常来正确解开堆栈.这是对堆栈溢出的检测,虽然它是特定于平台的.有关示例,请参阅boost :: regex的源代码. (2认同)
  • @qaz:re:你很惊讶它很难检测/处理溢出:这是因为实际上很少有程序需要这种堆栈深度.体系结构的设计几乎没有实际允许恢复/确定范围,因为边界通常比任何人都使用的数量级大,所以如果你到达那里,你最终会成为一个真正的泡菜.FWIW,树遍历有时可以在单个函数中迭代地实现,或多或少,具有正确的数据结构.(http://en.wikipedia.org/wiki/Tree_traversal) (2认同)
  • (或者保持树木平衡更好.;)) (2认同)

Pup*_*ppy 5

堆栈溢出是未定义的行为.编译器完全有权忽略它或导致任何事件发生.

  • @qaz:你不是.在Visual C++ 2010中,您可以从Windows捕获结构化异常(SEH),其中包括访问冲突,堆栈溢出等内容.但是,该语言并非旨在或旨在捕获此类事件. (2认同)