You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode全排列问题中AddressSanitizer负大小参数错误求助

LeetCode全排列问题内存错误排查

我在解决LeetCode全排列问题时遇到了内存错误,错误出现在引入vector v并尝试删除元素的场景中。之前直接从nums向量删除元素递归传递,代码能编译但会修改原nums导致答案错误,现在改用v操作却触发了内存错误。

我的代码

class Solution {
public:
    void generatePermutations(vector<int> nums, vector<int> output, vector<vector<int>> &ans) {
        vector<int> v = nums;
        if(nums.size() == 0) {
            ans.push_back(output);
            return;
        }
        for(int j = 0; j < nums.size(); j++) {
            output.push_back(nums[j]);
            v.erase(v.begin() + j);
            generatePermutations(v, output, ans);
        }
        
    }

    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> output;
        generatePermutations(nums, output, ans);
        return ans;
    }
};

错误信息

==23==ERROR: AddressSanitizer: negative-size-param: (size=-4)
    #7 0x7f3eeb6cb082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x602000000158 is located 0 bytes to the right of 8-byte region [0x602000000150,0x602000000158)
allocated by thread T0 here:
    #7 0x7f3eeb6cb082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
==23==ABORTING

问题分析与修复

核心问题

  1. v的重复修改导致越界:v在循环外初始化,第一次erase后长度变短,但循环条件是j < nums.size()(nums的初始长度),当j超过v的当前长度时,v.begin() + j会访问非法内存,触发AddressSanitizer错误。
  2. output未回溯:每次循环push_back(nums[j])后,没有在递归返回时pop_back,导致output累积之前的元素,生成错误的排列。
  3. v的复用错误:后续循环使用的是经过erase后的v,而不是基于原始nums重新创建,导致元素缺失。

修正后的代码

class Solution {
public:
    void generatePermutations(vector<int> nums, vector<int> output, vector<vector<int>> &ans) {
        if(nums.size() == 0) {
            ans.push_back(output);
            return;
        }
        for(int j = 0; j < nums.size(); j++) {
            // 每次循环重新创建v,基于当前nums,避免之前的修改影响
            vector<int> v = nums;
            output.push_back(nums[j]);
            v.erase(v.begin() + j);
            generatePermutations(v, output, ans);
            // 回溯:移除刚添加的元素,保证下一次循环的output干净
            output.pop_back();
        }
        
    }

    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> output;
        generatePermutations(nums, output, ans);
        return ans;
    }
};

内容的提问来源于stack exchange,提问作者migo2023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:35:20