Проблема с Деструктором-С++

Написал класс(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 шт):

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

Конструктор копирования затирает ранее выделенные указатели указателями из другого объекта вместо копирования значений из массивов: this->A[j] = other.A[j];

А лучше будет сделать один массив размером nxm.

→ Ссылка
Автор решения: AlexGlebe

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];

        }
    }
}
→ Ссылка