Деструктор пытается удалить массив и дает ошибку: A breakpoint instruction (__debugbreak() statement or a similar call)

Рейтинг: 0Ответов: 1Опубликовано: 19.04.2023

есть функция goThroughNeighbors(...), которая ищет рядом занятые клетки, Vector - класс для хранения пар чисел и ListVec - обычный односвязный список. Проблема в том что при каждой передаче Vector, c++ вызывает деструктор (с указателями также) и удаляет переменную (Vector v1,2... чтоб хоть как-то работало) после чего снова вызывает деструктор у переменной без данных и падает с ошибкой:

введите сюда описание изображения.

Без деструктора работает, но память быстро забивается. Как решить проблему?

Vector.h:

class Vector {
    private:
        int* arr = new int[2];
    public:
    Vector();
    ~Vector() {
        delete[] arr;
    }

    Vector(int x, int y);

    Vector copy() { return Vector(arr[0], arr[1]); };

    Vector operator+(const Vector& other) const;
    Vector operator-(const Vector& other) const;
    Vector& operator=(const Vector& other);
    int& operator[](int n) { return arr[n]; }
    bool operator==(const Vector& other) const;

    void add(const Vector* other);
    void subtract(const Vector* other);

    int get(const int n) const { return arr[n]; }

    int distanceSquared() const;
    int getSize() const { return 2; }
    std::string toString() const;
};

game.cpp:

void Game::goThroughNeighbors(Vector position, int player, ListVec* neighbors) const {
    Vector v1 = position.copy();
    Vector v2 = position.copy();
    Vector v3 = position.copy();

    if (!neighbors->contain(v1) && getField(v2) == player && player != 0) {
        ListVec list = *neighbors;
        list[list.lastAdded] = v3;
        list.lastAdded += 1;

        Vector v4 = position + Vector(1, 0);
        Vector v5 = position + Vector(-1, 0);
        Vector v6 = position + Vector(0, 1);
        Vector v7 = position + Vector(0, -1);

        goThroughNeighbors(v4, player, neighbors);
        goThroughNeighbors(v5, player, neighbors);
        goThroughNeighbors(v6, player, neighbors);
        goThroughNeighbors(v7, player, neighbors);
    }
}

Ответы

▲ 0Принят

Не вижу у вас копирующего конструктора. Значит, его сгенерирует компилятор. Значит, там будет просто копироваться указатель. Значит, при вызове деструктора будет освобождаться один и тот же указатель...

Вывод: вспомнить о правиле большой тройки и написать конструктор копирования.

Заодно интересно было бы посмотреть на реализации других ваших операторов и функций — там ведь тоже могут быть неприятности...