Помогите решить баг, не понимаю что точно не так. 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 шт):
В вашем примере наступает ошибка на шаге очистки памяти.
Вы вручную чистите ненужные матрицы b, c, но когда метод заканчивает работу, матрица c (создана внутри метода) выходит за область видимости метода и автоматически вызывается деструктор. Он пытается удалить уже очищенную область и поэтому возникает ошибка.
Решение: оставьте работу по удалению деструктору.
Также можно добавить конструктор перемещения, чтобы в будущем избежать примерно подобных проблем.