c++ - AddressSanitizer:堆缓冲区溢出地址 0x6020000000b4 在 pc 0x0000003a86fc bp 0x7ffeebd5f9d0 sp 0x7ffeebd5f9c8
问题描述
尝试解决 leetcode 上的问题,但我不断收到错误消息:
==29==错误:AddressSanitizer:地址 0x6020000000b4 上的堆缓冲区溢出 pc 0x0000003a86fc bp 0x7ffeebd5f9d0 sp 0x7ffeebd5f9c8 在 0x6020000000b4 线程 T0 处读取大小为 4
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
int size = arr.size();
int freq = 0;
vector<int> count;
for(int i=0; i<size;i++){
freq = std::count(arr.begin(), arr.end(), arr[i]);
}
count.push_back(freq);
int a = count [0];
for(int i = 0; i < count.size();i++){
if(count[i] == (count[i+1])){
return false;
}
}
return true;
}
};
不知道问题是什么,任何见解将不胜感激。先感谢您!
解决方案
在
for(int i = 0; i < count.size();i++){
if(count[i] == (count[i+1])){
return false;
}
}
i
将达到count.size()-1
并count[i+1]
成为count[count.size()-1+1]
哪个是 count[count.size()]
和超出范围。
编写此循环的更好方法是
for(int i = 1; i < count.size(); i++){
if(count[i-1] == (count[i])){
return false;
}
}
它稍后开始一个,然后少迭代一个。如果少于 2 个元素count
使缓冲区不可能下溢,则退出条件会阻止循环进入。
注意:这个答案没有考虑算法的正确性。