调试断言失败(向量下标超出范围)

Posted

技术标签:

【中文标题】调试断言失败(向量下标超出范围)【英文标题】:Debug Assertion Fail (vector subscript out of range) 【发布时间】:2021-12-22 08:49:46 【问题描述】:

我发现我的result.push_back(make_pair(a[i], b[j]));, 导致这个错误,但我不知道为什么(我什至不访问vector<pair<int,int>>result;

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<utility>
using namespace std;
void input(int n,vector<int>&a) 
    int temps;
    for (int i = 0; i < n; i++) 
        cin >> temps;
        a.push_back(temps);
    

int main() 
    //input
    long n, m;
    cin >> n; //6
    vector<int>a, b;
    input(n, a); //2 5 4 1 7 5
    cin >> m; //7
    input(m, b); //2 3 1 3 2 4 6
    //algorithm
    long max = *max_element(a.begin(), a.end()) + *max_element(b.begin(), b.end());
    long min = *min_element(a.begin(), a.end()) + *min_element(b.begin(), b.end());
    vector<pair<int, int>>result;
    int possible = max, plate = 0; 
    for (int check = max; check >= min; check--) 
        int j = 0, i = 0, plate2 = 0;
        for (; i < a.size(); i++) 
            if (a[i] >= check) 
            else 
                if (j > b.size() - 1)  break; 
                if (a[i] + b[j] >= check) 
                    j++; plate2++;
                    result.push_back(make_pair(a[i], b[j]));
                
                else 
                    i--; j++;
                
            
        
        if (i > a.size() - 1)  possible = check; plate = plate2; break;  
    
    cout << possible << " " << plate << endl; //5 3 
    return 0;
 
    

如果删除result.push_back(make_pair(a[i],b[j]); 行,则不再有错误消息,所以我认为我没有访问错误的 a[i] 和 b[j] 元素

【问题讨论】:

但我不知道为什么 -- 如果运行时告诉你下标超出范围,那么原因是你的期望不是你想象的那样是,并且您的程序有一个或多个错误导致索引超出范围。下一步是让你调试你的代码,看看你的逻辑为什么不正确。 @PaulMcKenzie 哦,我的,谢谢你,我才意识到我放错了流程,它应该放在'j++;'之前 如果这是 Visual Studio,则调试器会中断此断言,然后在中断时将调试工具栏上的“堆栈框架”更改为您的代码。然后检查变量以查看问题所在的确切行以及您是如何越界的。 【参考方案1】:
if (j > b.size() - 1)  break;   //(1)
           if (a[i] + b[j] >= check)   //(2)
               j++; plate2++;   // HERE IS YOUR PROBLEM (3)
               result.push_back(make_pair(a[i], b[j]));   //(4)

假设开头是j == b.size()-1if (j &gt; b.size() - 1) 子句为假,因此循环不break。它继续(2),没关系。在 (3) 中,您将 +1 添加到 j,所以现在是 j == b.size()。在 (4) 中,您尝试访问 b[j],现在是 b[b.size()],这是无效的,因为 indizes 从 0 开始。

IOW:您试图确保 j 永远不会超过有效元素的数量,但随后您在测试后递增 j 并访问无效内存。

【讨论】:

非常感谢,我已经意识到了。顺便说一句,有没有找到确切的创建断言错误的行?应该有,但是不知道用在哪里

以上是关于调试断言失败(向量下标超出范围)的主要内容,如果未能解决你的问题,请参考以下文章

调试断言失败(向量下标超出范围)

(opencv) 调试断言失败,向量下标超出范围

调试错误 - 向量下标超出范围 - PCL

如何在 Linux 上强制执行向量下标超出范围调试断言

调试断言失败,字符串下标超出范围

unordered_map 在使用 [] 运算符时报告“向量下标超出范围”断言