0

So I wrote this: Matrix.h:

#pragma once
class Matrix
{
private:
int m, n;
double** M = nullptr;


public:
Matrix();
Matrix(int,int);
Matrix(const Matrix&);
~Matrix();

void set_m(int);
void set_n(int);
int get_m() const;
int get_n() const;
void setM(double**,int,int);
double** getM() const;
void show();
Matrix operator*(Matrix&) const;

};

Matrix.cpp:

#include "Matrix.h"
#include<iostream>

using namespace std;

/*

*/

Matrix::Matrix()
{

set_n(1);
set_m(1);
delete[] M;
M = new double*[get_m()];
for (int i = 0; i < m; i++) {
    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = 1.0;

}

Matrix::Matrix(int m_,int n_)
{

set_n(n_);
set_m(m_);
delete[] M;
M = new double *[get_m()];
for (int i = 0; i < m; i++) {
    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = 1.0;

 }

 Matrix::Matrix(const Matrix& M_)
 {

set_n(M_.get_n());
set_m(M_.get_m());
delete[] M;
M = new double*[get_m()];
for (int i = 0; i < m; i++) {

    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = M_.getM()[i][j];

}

void Matrix::set_m(int m_) {
if (m_ > 0)
    m = m_;
else
    m = 1;
}

void Matrix::set_n(int n_) {
if (n_ > 0)
    n = n_;
else
    n = 1;
}

double** Matrix::getM() const {
return M;
}

Matrix Matrix::operator*(Matrix &M_) const
{
if (get_n() != M_.get_m()) {
    if (get_m() != M_.get_n()) return Matrix();
    else {
        Matrix T(*this);
        return M_*T;
    }
}
else {
    //n = m
    Matrix R(get_m(), M_.get_n());
    for (int i = 0; i < get_m(); i++) {
        for (int j = 0; j < M_.get_n(); j++) {
            double res = 0;
            for (int k = 0; k < get_n(); k++) {
                res += getM()[i][k] * M_.getM()[k][j];
            }
            R.getM()[i][j] = res;
        }
    }
    return R;
}
}

int Matrix::get_m() const {
return m;
}

int Matrix::get_n() const {
return n;
}

void Matrix::setM(double** M_, int m_, int n_) {
set_m(m_);
set_n(n_);
for (int i = 0; i < get_m(); i++) {
        delete M[i];
}
    delete[] M;

M = new double*[m_];
for (int i = 0; i < m; i++) {
    M[i] = new double[n_];
}
for (int i = 0; i < m_; i++)
    for (int j = 0; j < n_; j++) M[i][j] = M_[i][j];
}

void Matrix::show() {
for (int i = 0; i < get_m(); i++) {
    for (int j = 0; j < get_n(); j++) {
        cout << getM()[i][j]<<" ";
    }
    cout << endl;
}
}

Matrix::~Matrix()
{
for (int i = 0; i < get_m(); i++) {
    delete M[i];
}
delete[] M;
}

It crashes at void Matrix::setM(...) when I try to delete M[i] for i = 1; it doe perfectly fine for i=0; but crashes later and I do not have a rational explanation why does it do that. I can see the debugger showing me that the memory cannot be read even before it actually crashing but I do not understand how to fix it. Thanks in advance!

AVI
  • 1

1 Answers1

0

You are setting your m before deleting your array based on the old value of m and end up deleting your old array using the new value of m. You should first delete your array, then set mm, and then create your new array.

Jim Buck
  • 20,482
  • 11
  • 57
  • 74