Проблема с Деструктором-С++
Написал класс(class matrix) в котором нужно реализовать конструктор копирования, все пошло хорошо, но проблема с деструктором.
Основная проблема: создаю два объекта класса 1)'a' 2)'b',делаю с ними нужные манипуляции,но как дело доходит до деструктора(касаемо объекта 'a',то возникает ошибка,пробежался отладчиком,показывает,что объект а уже не существует).(Конструктор копирования проверил,адреса у объектов разные)
(СКРИН ОШИБКИ ПРИКРЕПЛЮ НИЖЕ КОДА.)
Вот код(для удобности написал комментарии и выводил адреса объектов ,и что и когда вызывается):
#include <iostream>
#include <Windows.h>
#include<iomanip>
typedef unsigned int uint;
class matrix
{
//n-строки,m-столбцы.
uint n, m; //uint=unsigned int
int** A = nullptr;
public:
matrix(uint valueN,uint valueM);//Конструктор
~matrix();//деструктор.
matrix(const matrix& other);//Конструктор копирования
//Заголовки методов,определенных ниже.
void Add_Memory();
void Init_Matrix();
void Print_Matrix();
//Операторы
void operator=(const matrix& a);
matrix operator+(const matrix& other);
};
int main()
{
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
matrix a(3,3);
a.Init_Matrix();
matrix b(a);
a.Print_Matrix();
b.Print_Matrix();
return 0;
}
#pragma region Конструктор,деструктор,кон.копирования
//Конструктор.
matrix::matrix(uint valueN, uint valueM)
{
std::cout << "Adress:" << this<<std::endl;
std::cout << "Вызвался конструктор\n";
n = valueN;
m = valueM;
Add_Memory();
}
//Деструктор
matrix::~matrix()
{
std::cout << "Adress:" << this << std::endl;
std::cout << "Вызвался деструктор\n";
for (uint i = 0; i < n; i++)
{
delete[] this->A[i];
}
delete[] this->A;
}
//Конструктор копирования
matrix::matrix(const matrix& other)
{
std::cout << "Adress:" << this << std::endl;
std::cout << "Вызвался конструктор копирования\n\n";
this->n = other.n;
this->m = other.m;
this->A = new int* [n];
for (uint i = 0; i < n; i++)
{
this->A[i] = new int[m];
}
for (uint i = 0; i < n; i++)
{
for (uint j = 0; j < m; j++)
{
this->A[j] = other.A[j];
}
}
}
#pragma endregion
#pragma region Методы
//******МЕТОДЫ******//
void matrix::Add_Memory()
{
A = new int* [n];
for (uint i = 0; i < n; i++)
{
A[i] = new int[m];
}
}
void matrix::Init_Matrix()
{
srand(static_cast<uint>(GetTickCount64()));
for (uint i = 0; i < n; i++)
{
for (uint j = 0; j < m; j++)
{
A[i][j] = rand() % 100 - 13;
}
}
}
void matrix::Print_Matrix()
{
for (uint i = 0; i < n; i++)
{
for (uint j = 0; j < m; j++)
{
std::cout <<std::setw(3)<< this->A[i][j]<<" ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
#pragma endregion
Вот консоль и сама ошибка:
Ответы (2 шт):
Конструктор копирования затирает ранее выделенные указатели указателями из другого объекта вместо копирования значений из массивов: this->A[j] = other.A[j];
А лучше будет сделать один массив размером nxm.
Q: подскажите пожалуйста,как тогда это исправить?Я проверял точно такую же методику с динамическими массивами(не матрицами),все работает хорошо.
//Конструктор копирования
matrix::matrix(const matrix& other)
{
std::cout << "Adress:" << this << std::endl;
std::cout << "Вызвался конструктор копирования\n\n";
this->n = other.n;
this->m = other.m;
this->A = new int* [n];
for (uint i = 0; i < n; i++)
{
this->A[i] = new int[m];
}
for (uint i = 0; i < n; i++)
{
for (uint j = 0; j < m; j++)
{
// всего-лишь индекс ряда нужно было добавить
this->A[i][j] = other.A[i][j];
}
}
}
