Почему я получаю сообщение об ошибке переполнения буфера динамической памяти - PullRequest
0 голосов
/ 28 апреля 2020

Я выполняю задачу Leetcode 281. Зигзагообразный итератор, и я получаю ошибку во время выполнения, которая, по-видимому, не дублируется на моем локальном компьютере.

Мой код

class ZigzagIterator {
public:
    ZigzagIterator(vector<int>& v1, vector<int>& v2) : v1{v1}, v2{v2}, it1{v1.begin()}, it2{v2.begin()}, first{false} {

    }

    int next() {
        int val{0};
        if(first || it1 == v1.end()) {
            val = *it2;
            it2++;
            first = false;
        }
        else 
        {
            val = *it1;
            it1++;
            cout << (it1 == v1.end()) << " " << *it1 << endl;

            first = true;
        }

        return val;
    }

    bool hasNext() {
        return (it1 != v1.end() || it2 != v2.end());
    }
private:
    // const vector<int> &v1;
    // const vector<int> &v2;
    vector<int> v1;
    vector<int> v2;
    std::vector<int>::iterator it1;
    std::vector<int>::iterator it2;
    bool first;    
};

int main()
{
  vector<int> v1{1,2};
  vector<int> v2{3,4,5,6};
  ZigzagIterator i(v1, v2);
  while (i.hasNext()) cout << i.next();
}

Ошибка времени выполнения:

AddressSanitizer: heap-buffer-overflow on address 0x602000000038 at pc 0x0000003843a6 bp 0x7ffeea8b3b50 sp 0x7ffeea8b3b48

Я вставил оператор печати в условие else next(). На втором отпечатке (it1 == v1.end()) должен быть равен true, но, похоже, он равен false на leetcode и true на моей локальной машине. У меня где-нибудь есть ошибка кода?

1 Ответ

4 голосов
/ 28 апреля 2020

Ваша проблема со всем кодом, который сравнивает it1 и it2 с v1 и v2 в классе. Члены класса v1 и v2 являются копиями v1 и v2 из main, поэтому с ними нельзя использовать it1 и it2, поскольку it1 и it2 являются итераторами в main векторы, а не вы классы.

Вам необходимо сделать ссылки на элементы v1 и v2, чтобы все ссылались на один и тот же вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...