运行时错误:引用绑定到“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 > 1)
和 (row > 1)
以避免分别只有 1 列或 1 行的极端情况的缓冲区溢出,它才出现此问题。
【问题讨论】:
我认为你错过了,处理row == 0
或col == 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容器
在其他容器中使用 boost::container::static_vector 时,gcc 编译错误“将‘const s’绑定到‘s&’类型的引用丢弃限定符”