【发布时间】:2024-01-15 04:36:01
【问题描述】:
I am getting the following Runtime error:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==32==ERROR: AddressSanitizer: stack-overflow on address 0x7ffcdc3e2ff8 (pc 0x00000038409c bp 0x7ffcdc3e3020 sp 0x7ffcdc3e3000 T0)
==32==ABORTING
同时解决https://leetcode.com/problems/unique-paths-iii/
我无法弄清楚它的根本原因。
我的源代码如下:
#define vvi vector<vector<int> >
#define vi vector<int>
class Solution {
public:
int helper(vvi &grid, vvi &dp, int m, int n, int i, int j) {
if(i < 0 || i >= n || j < 0 || j >= m || -1 == grid[i][j])
return 0;
if(0 == dp[i][j]) {
if(2 == grid[i][j])
dp[i][j] = 1;
else
dp[i][j] = helper(grid, dp, m, n, i - 1, j) +
helper(grid, dp, m, n, i, j + 1) +
helper(grid, dp, m, n, i + 1, j) +
helper(grid, dp, m, n, i, j - 1);
}
return dp[i][j];
}
int uniquePathsIII(vector<vector<int>>& grid) {
if(grid.size() == 0)
return 0;
int n = grid.size();
int m = grid[0].size();
vvi dp(n, vi(m, 0));
return helper(grid, dp, m, n, 0, 0);
}
};
感谢您的帮助:)
【问题讨论】:
-
每次调用
helper()时,操作系统都必须将当前调用存储到同一个函数,这样才能继续上一次调用。 “存储”称为堆栈。这种递归会占用大量堆栈空间,这比程序 var 的可用内存要少得多。 -
这个问题可以通过提供一个可以用来复现错误的小程序来大大改善。添加缺少的标头并编写一个
main,它提供一个触发堆栈溢出的数据集,人们可以编译、运行和试验。使用minimal reproducible example 作为灵感。
标签: c++ recursion runtime-error dynamic-programming address-sanitizer