天天看点

Leetcode报错:[AddressSanitizer: heap-buffer-overflow on address xxxx at pc xxxxx bp xxxx]

    背景:win32+devcpp 5.11

    问题:下述代码在本地devcpp运行无误,leetcode报错地址越界

class Solution {
public:
    vector<int> num;
    vector<int>::iterator it;
    vector<vector<int> > minimumAbsDifference(vector<int>& arr) {
		vector<vector<int> > mini;
		vector<int>::iterator it;
		vector<vector<int> >::iterator iter;
        sort(arr.begin(),arr.end());//步骤一排序
		int t=abs(*(arr.end())-*arr.begin());//t记录最小差值 
        
		for(it=arr.begin()+1;it<arr.end();it++){//循环遍历,寻找相邻差中最小的那个 
			int k=*(it)-*(it-1);//变量k记录从第1项开始,后项与前一项的差值 
			if(t>k){
				swap(t,k);
			}
		}
		
		for(it=arr.begin()+1;it<arr.end();it++){//循环遍历,寻找差值与记录下的值相等的元素对 
			vector<int> vec;
			if(t==*(it)-*(it-1)){//找到了元素对 
				// cout<<*(it-1)<<" "<<*it<<endl;
				vec.push_back(*(it-1));
				vec.push_back(*(it));
				mini.push_back(vec);
			}
		}
		
	
		return mini;
    }
};
           

仔细排查发现第十行的int t=*arr.end()-*arr.begin();出错,arr.end()返回一个指向最后一个元素后面一位的迭代器,再用*使用该元素,元素不存在,访问越界了。

将其改为:int t=*(arr.end()-1)-*arr.begin();后通过LeetCode检测。

深入一步:为啥devcpp中没有检测出这个bug?