首页 > 解决方案 > 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;
    }
  
};

不知道问题是什么,任何见解将不胜感激。先感谢您!

标签: c++

解决方案


for(int i = 0; i < count.size();i++){
    if(count[i] == (count[i+1])){
        return false;
    }
}

i将达到count.size()-1count[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使缓冲区不可能下溢,则退出条件会阻止循环进入。

注意:这个答案没有考虑算法的正确性。


推荐阅读