使用std::rotate反向迭代器实现数组右旋转时遇堆溢出求助
LeetCode Rotate Array 堆溢出问题排查
我在解决LeetCode的Rotate Array问题,需要将vector<int>右旋转k个位置。由于std::rotate默认是左旋转,我尝试用反向迭代器实现右旋转,代码如下:
void rotate(vector<int>& nums, int k) { std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend()); }
这段代码通过了前两个测试用例,但提交后出现堆溢出(heap-overflow)错误,错误信息如下:
=21==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000034c at pc 0x000000369815 bp 0x7fff32cde700 sp 0x7fff32cde6f8 READ of size 4 at 0x60200000034c thread T0 #3 0x7f55da0cc082 (/lib/x86_64-linux-gnu/libc.so.6+0x24082) 0x60200000034c is located 4 bytes to the left of 4-byte region [0x602000000350,0x602000000354)
请问是我的代码存在问题,还是LeetCode平台本身的问题?
问题原因与修复
问题出在你的代码中,未处理k大于数组长度的情况。当k >= nums.size()时,nums.rbegin() + k会超出反向迭代器的合法访问范围,导致越界访问堆内存,触发堆溢出错误。
比如数组长度为3、k为5时,nums.rbegin() +5对应的正向位置是数组起始位置之前2个元素的区域,属于非法内存。
修复方法是先对k取模,确保k落在[0, nums.size())范围内,同时处理k=0的情况(无需旋转):
void rotate(vector<int>& nums, int k) { k = k % nums.size(); if (k == 0) return; std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend()); }
取模操作后,k的取值范围被限制在合法区间内,nums.rbegin() +k不会再越界,就能避免堆溢出问题。
内容的提问来源于stack exchange,提问作者IRP_HANDLER
相关产品推荐
相关产品推荐

