c++ - 尝试/捕获丢失的 vector 下标超出范围(调试断言失败)

标签 c++ debugging vector try-catch

我有一些代码,我正在使用std::forward_list我的代码部分测试了 vector 下标是否超出范围,以及 vector 中的元素是否具有某些属性(在这种情况下,不是-1)。
当我只有列表的第一个或第二个节点时,它可以正常工作,并且我可以捕获错误,因为那只是程序的正常部分。但是,在下一个循环中,当我在列表中有3个元素时,我得到了vector subscript out of range调试断言,并且它未被try/catch捕获。我必须使用其他技术来解决此错误吗?
这是一个有问题的代码段:

  for(int i = 0; i < 8; i++)
        {
            if(curr->moves[i].at(0) >= 0 && curr->moves[i].at(1) >= 0)
            {
                next->setPos(curr->moves[i].at(0),curr->moves[i].at(1)); //just sets values of a vector
                next->setMoves(); //sets values of a 2d vector
                for(int j = 0; j < 8; j++)
                {
                    try{if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1)] != -1)  //the debug assertion is thrown here, but I cannot catch it
                            next->moves[i].at(2) = 1;}
                    catch(out_of_range const &err)
                        {next->moves[i].at(2) = 1;}
                }
            ...
          }
     }

我已评论发生问题的位置。您(至少在我的屏幕上)必须滚动到右侧才能看到它。我相信,潜在地,我可以使用另一个catch语句,但是由于我已经在使用out_of_range,因此我不知道要使用哪个错误,通常可以处理此问题。引发错误时的外观的屏幕快照为this。完全清楚地说,问题发生在try{if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1) != -1),我已在其中评论。我认为它根本没有转到catch语句,因为它使用的是_DEBUG_ERROR()

最佳答案

从理论上讲,try/catch语句可以在此处捕获错误,但故意将错误作为算法的一部分来处理是不明智的; try/catch应该用于在发生错误时进行报告。在这种情况下,我应该使用:

if(next->moves[i].at(0) >= 0 && next->moves[i].at(1) >= 0) //1
    if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1)] != -1) //2
        next->moves[i].at(2) = 1; //3
else
    next->moves[i].at(2) = 1; //3

这使我可以检查下标是否超出范围(1),检查板的元素是否不为-1(2),以及在这些情况下将moves[i].at(2)设置为1(3)。
这样可以避免out_of_range错误,从而完全不需要try/catch

关于c++ - 尝试/捕获丢失的 vector 下标超出范围(调试断言失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48728058/

相关文章:

c++ - 调用 CefBrowserHost::CreateBrowser 时出现 Visual Studio C++ 奇怪的异常

c++ - 使用集合来存储自定义类,只有第一个插入有效

c++ - 如何以更通用的方式转换 unique_ptr 的 vector

c++ - 使用/不使用预处理器在 C++ 中创建新的运算符

c++ - 如何在 PC/Visual C++ 上查明指针是否在堆栈上

google-chrome - Google Chrome - 故障转储位置

c++ - 如何在 hpp 中声明一个 vector ?

C++类成员的静态成员变量被实例化两次

c++ xerces reference没有定义但已定义

c++ - 如何记录或重播崩溃前立即执行的行或指令