Помогите решить баг, не понимаю что точно не так. Debug твердит Signal = SIGTRAP (Trace/breakpoint trap)

Я работаю с классами. Создаю свой класс Матриц. Ошибка появилась когда я стал делать сложение матриц

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;

class Matrix
{
private:
    int rows;
    int columns;
    int** ptrarray;
public:
    Matrix(int valueRows, int valueColumns)
    {
        // конструктор
        rows = valueRows;
        columns = valueColumns;
        Create();
    }
    ~Matrix()
    {
        // деструктор
        for (int i = 0; i < rows; i++)
            delete[] ptrarray[i];
        delete[] ptrarray;
        cout << "Matrix has deleted" << endl;
    }
    void Create()
    {
        // создание матрицы или двумерного динамического массива
        ptrarray = new int* [rows];
        for (int count = 0; count < rows; count++)
            ptrarray[count] = new int[columns];
    }
    void Input()
    {
        // ввод элементов матрицы
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < columns; j++) {
                cout << "Введите элемент " << i + 1 << ' ' << j + 1 << endl;
                cin >> ptrarray[i][j];
            }
    }
    void Print()
    {
        // вывод всех элементов матрицы
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
                cout << ptrarray[i][j] << ' ';
            cout << endl;
        }
    }
    void CleanMemory(int** arr, int n) 
    {
        for (int i = 0; i < n; i++) {
            delete[] arr[i];
        }
        delete[] arr;
    }
    void Sum(Matrix a, Matrix b)
    {
        if (a.rows != b.rows || a.columns != b.columns) {
            cout << "Матрицы не одинаковы" << endl;
            return;
        }
        Matrix c(a.rows, a.columns);
        b.Input();
        for (int i = 0; i < a.rows; i++) {
            for (int j = 0; j < a.columns; j++)
                c.ptrarray[i][j] = a.ptrarray[i][j] + b.ptrarray[i][j];
        }
        c.Print();
        CleanMemory(b.ptrarray, b.rows);
        CleanMemory(c.ptrarray, c.rows);
    }

    int main()
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int a, b;
    cout << "Здраствуйте\nВведите количество строк и столбцов матрицы: " << endl;
    cin >> a >> b;
    Matrix matr(a, b);
    int choice = 0;
    while (true)
    {
        cout << "Выберите номер задания которое хотите выбрать: \n"
            << "1. Заполнить матрицу\n"
            << "2. Вывести матрицу \n"
            << "3. Cложение матриц \n"
            << "4. Выход" << endl;

        cin >> choice;
        switch (choice)
        {
        case 1:
        {
            matr.Input();
            break;
        }
        case 2:
        {
            matr.Print();
            break;
        }
        case 3:
        {
            cout << "Введите количество строк и столбцов второй матрицы:" << endl;
            cin >> a >> b;
            Matrix matr2(a, b);
            matr.Sum(matr, matr2);
            break;
        }
        case 4:
        {
            cout << "До свидания";
            return 0;
        }
        default:
            cout << "Введен неккоректный запрос" << endl;
            return 0;
        }
    }

}

По ощущениям проблема с памятью. Только не могу понять где именно. И пожалуйста можно без сильно сложного кода, я все еще на начальных этапах изучения языка.


Ответы (1 шт):

Автор решения: Igoryao

В вашем примере наступает ошибка на шаге очистки памяти.

Вы вручную чистите ненужные матрицы b, c, но когда метод заканчивает работу, матрица c (создана внутри метода) выходит за область видимости метода и автоматически вызывается деструктор. Он пытается удалить уже очищенную область и поэтому возникает ошибка.

Решение: оставьте работу по удалению деструктору.

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

→ Ссылка