天天看點

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?