【问题标题】:Runtime Error AddressSanitizer:DEADLYSIGNAL in leetcodeleetcode 中的运行时错误 AddressSanitizer:DEADLYSIGNAL
【发布时间】: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


【解决方案1】:

问题已解决。这是因为被访问的节点再次被推入堆栈进行计算,这导致了无限递归。

使用访问数组解决了这个问题,该数组确保路径中的特定块只检查一次。

如果您遇到类似问题,请检查您的递归是否会终止或无限循环。

【讨论】:

    最近更新 更多