C++数独程序运行类setter方法时无错误停止执行问题求助
问题可能成因分析
findValidValues返回空std::vector,触发未定义行为
当遍历到某个单元格时,findValidValues(i,j)没有返回任何合法值,此时validValues.size() == 0,执行rand() % validValues.size()就会触发除0错误,这类硬件异常不属于C++标准异常的捕获范围,添加在setNumber内的try-catch完全无法捕获,程序会直接静默终止。调试时行号显示可能存在偏移,会让你误以为崩溃发生在this->number = n这一行,实际崩溃点在前面的validValues.at()或者取模运算环节。
你可以在validValues定义后加一行校验代码快速验证:
if (validValues.empty()) { std::cout << "No valid value for cell (" << i << "," << j << ")" << std::endl; abort(); }- 网格内存访问越界
检查Sudoku类中rows、cols成员的类型:如果二者是无符号类型,而构造函数传入的rows/cols参数为负数,隐式类型转换会把负数转为极大的无符号值,导致new申请的内存和实际遍历范围不匹配,后续遍历grid数组时触发越界访问,出现段错误直接终止。
另外也要检查setRows、setCols的实现,确认是否正确对输入参数做了合法性校验、正确给成员变量赋值。
- 网格内存访问越界
Cell类成员定义异常
如果Cell类中的number成员不是普通int类型,而是未初始化的int*指针/int&引用,执行this->number = n时就会访问非法内存直接崩溃。如果是普通int类型则该环节不会触发崩溃。
- 随机数生成逻辑异常
若你没有提前调用srand()初始化随机数种子,部分环境下rand()的返回值可能出现异常,叠加validValues非空但边界处理错误的情况也可能触发异常。
- 随机数生成逻辑异常
内容的提问来源于stack exchange,提问作者pab6750
相关产品推荐
相关产品推荐

