C++程序运行触发ucrtbased.dll未处理异常崩溃是什么原因?
错误原因
你遇到的0xC00000FD错误是典型的堆栈溢出,根本原因是代码存在无终止条件的无限递归调用:
main函数调用doA()doA()执行后调用doB()doB()执行后又调用doA()
二者形成死循环调用链,没有任何跳出逻辑。每次函数调用都会在栈空间中压入返回地址、栈帧等数据,而程序的栈空间是固定大小的(Windows下默认通常为1MB),循环调用成千上万次后栈空间被完全耗尽,就触发了堆栈溢出崩溃,报错指向第8行是因为doB()中调用doA()的语句刚好是栈被撑爆时正在执行的代码。
修复方案
给递归调用增加终止条件即可,示例修改代码如下:
#include <iostream> // 增加计数器控制递归次数,也可以用静态变量、函数参数传递等方式实现 int call_count = 0; const int MAX_CALL_COUNT = 10; void doA(); void doB() { std::cout << "In doB()\n"; // 调用前判断是否超过最大次数 if (call_count < MAX_CALL_COUNT) { call_count++; doA(); } } void doA() { std::cout << "Starting doA()\n"; // 调用前判断是否超过最大次数 if (call_count < MAX_CALL_COUNT) { call_count++; doB(); } std::cout << "Ending doA()\n"; } int main() { std::cout << "Starting main()\n"; doA(); std::cout << "Ending main()\n"; return 0; }
内容的提问来源于stack exchange,提问作者spuqe
相关产品推荐
相关产品推荐

