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
问题分析与修复
核心问题
- v的重复修改导致越界:v在循环外初始化,第一次
erase后长度变短,但循环条件是j < nums.size()(nums的初始长度),当j超过v的当前长度时,v.begin() + j会访问非法内存,触发AddressSanitizer错误。 - output未回溯:每次循环
push_back(nums[j])后,没有在递归返回时pop_back,导致output累积之前的元素,生成错误的排列。 - 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
相关产品推荐
相关产品推荐

