运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)

Posted

技术标签:

【中文标题】运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)【英文标题】:Runtime error: Reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h) 【发布时间】:2021-09-09 05:12:36 【问题描述】:
 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
        int row = obstacleGrid.size();
        int col = obstacleGrid[0].size();
       
        if(obstacleGrid[0][0] == 1)
            return 0;
        
        
        if(row = 1 && col == 1)
            return 1;
        
        
        vector<vector<int>> dp(row, vector<int>(col, 0));
        bool flag = false;
        if(col > 1)
            for(int i = 0; i < col; i++)     
                if(flag == true || obstacleGrid[0][i] == 1)
                    flag = true;
                    dp[0][i] = 0;
                else
                    dp[0][i] = 1;
                
            
            if(row == 1)
                return dp[0][col - 1];
            
        
        
        flag = false;
        
        if(row > 1)    
            for(int j = 1; j < row; j++)
                if(flag == true || obstacleGrid[j][0] == 1)
                    flag == true;
                    dp[j][0];
                else
                    dp[j][0] = 1;
                
            
            if(col == 1)
                return dp[row - 1][0];
            
        
        //fill the rest

        for(int i = 1; i < row; i++)
            for(int j = 1; j < col; j++)
                if(obstacleGrid[i][j] == 1)
                    dp[i][j] = 0;
                else
                    dp[i][j] = (dp[i-1][j] + dp[i][j-1]);
                
            
        
        return dp[row - 1][col - 1];
    

Testcase
Run Code Result
Debugger
Runtime Error
Line 1034: Char 9: runtime error: reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9

作为参考,这是关于 leetcode (Unique Paths II) 的问题 58。我设法将错误的来源缩小到这部分代码

         if(col > 1)
            for(int i = 0; i < col; i++)
                if(flag == true || obstacleGrid[0][i] == 1)
                    flag = true;
                    dp[0][i] = 0;
                else
                    dp[0][i] = 1;
                
                
            
            if(row == 1)
                return dp[0][col - 1];
            
         

奇怪的是,它在 VSCode 的 WSL 调试器上正常工作,使用参数 0,0,0, 0,1,0, 0,0,0 它返回“2”,如预期的那样。此外,直到我输入条件 (col &gt; 1)(row &gt; 1) 以避免分别只有 1 列或 1 行的极端情况的缓冲区溢出,它才出现此问题。

【问题讨论】:

我认为你错过了,处理row == 0col == 0 案件,最后你有dp[row - 1][col - 1] 从它看起来的约束来看,m 和 n(行,列)必须至少为 1。无论如何,当行或列之一的值为 1 但如果两者都大于 1 时,它可以工作它会触发错误。 【参考方案1】:

改正错别字,效果很好。

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    int row = obstacleGrid.size();
    int col = obstacleGrid[0].size();
       
    if(obstacleGrid[0][0] == 1)
        return 0;
    
        
    if(row == 1 && col == 1) // First typo. row == 1 instead of row = 1
        return 1;
    
        
    vector<vector<int>> dp(row, vector<int>(col, 0));
    bool flag = false;
    if(col > 1)
        for(int i = 0; i < col; i++)     
            if(flag == true || obstacleGrid[0][i] == 1)
                flag = true;
                dp[0][i] = 0;
            else
                dp[0][i] = 1;
            
        
        if(row == 1)
            return dp[0][col - 1];
        
    
    
    flag = false;
        
    if(row > 1)    
        for(int j = 1; j < row; j++)
            if(flag == true || obstacleGrid[j][0] == 1)
                flag = true; //second one. flag = true instead of flag == true
                dp[j][0] = 0; //third. no value assigned.
            else
                dp[j][0] = 1;
            
        
        if(col == 1)
            return dp[row - 1][0];
        
    
    //fill the rest

    for(int i = 1; i < row; i++)
        for(int j = 1; j < col; j++)
            if(obstacleGrid[i][j] == 1)
                dp[i][j] = 0;
            else
                dp[i][j] = (dp[i-1][j] + dp[i][j-1]);
            
        
    
    return dp[row - 1][col - 1];

【讨论】:

以上是关于运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)的主要内容,如果未能解决你的问题,请参考以下文章

运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)

运行时错误:引用绑定到“std::vector<int, std::allocator<int> >”类型的空指针 (stl_vector.h)

无法对空引用执行运行时绑定,但它不是空引用

C/C++4C++基础:函数重载,类和对象,引用,/string类,vector容器

非常量引用绑定到临时的 Visual Studio 错误?

在其他容器中使用 boost::container::static_vector 时,gcc 编译错误“将‘const s’绑定到‘s&’类型的引用丢弃限定符”