Постоянно сталкиваюсь с одними и теми же исключениями

Помогите все время сталкиваюсь с этим исключением Вызвано исключение по адресу 0x00A67B48 в Project1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу Как исправить?

#include <iostream>
using namespace std;
class Matr;
class Vect {
private:int a, * v;
public:
Vect() {}
Vect(int c) {
    a = c;
    v = new int[a];
}
Vect(const Vect& r) {
    a = r.a;
    v = new int[a];
    for (int i = 0; i < a; i++) {
        v[i] = r.v[i];
    }
}
void fill() {
    for (int i = 0; i < a; i++) {
        v[i] = rand() % 10;
    }
}
void show() {
    for (int i = 0; i < a; i++)
        cout << v[i] << " ";
}
friend Vect Multiply(const Vect& w, int t);
friend Vect Multiply(const Matr& g, const Vect& w);
~Vect() { delete[] v; }
};
class Matr {
private: int a, b, ** m;
public: Matr ()
{
}
       Matr(int d, int e) {
           a = d; b = e;
           m = new int* [a];
           for (int i = 0; i < a; i++) {
               m[i] = new int[b];
           }
       }
       Matr(const Matr& p) {
           a = p.a;
           b = p.b;
           m = new int* [a];   // для новой копии
           for (int i = 0; i < a; i++)
               m[i] = new int[b];

           for (int i = 0; i < a; i++) {
               for (int j = 0; j < b; j++) {
                   m[i][j] = p.m[i][j];

               }
           }
       }
       void fill() {
           for (int i = 0; i < a; i++) {
               for (int j = 0; j < b; j++) {
                   m[i][j] = rand() % 10;
               }
           }
       }
           void show() {
               for (int i = 0; i < a; i++) {
                   for (int j = 0; j < b; j++) {
                       cout << m[i][j] << "\t";
                   }
                   cout << "" << endl;
               }
           }
           friend Matr Multiply(const Matr& g, int t);
           friend Vect Multiply(const Matr& g, const Vect& w);
           friend Matr Multiply(const Matr& g, const Matr& f);
           ~Matr() {
               for (int i = 0; i < a; i++) {
                   delete[] m[i];
               }
               delete[] m;
           }
       };
int main() {
    Matr a(3, 4);
    a.fill();
    a.show();
    cout << "\n" << endl;
    Matr c = Multiply(a, 3);
    c.show();
    Vect b(4);
    b.fill();
    b.show();
    cout << "\n" << endl;
    Vect d = Multiply(a, b);
    d.show();
    cout << "\n" << endl;
    Matr t(4, 2);
    t.fill();
    t.show();
    Matr y = Multiply(a, t);
    cout << "\n" << endl;
    y.show();
}




Matr Multiply (const Matr& g, int t) {
    Matr c(g);
    for (int i = 0; i < g.a; i++) {
        for (int j = 0; j < g.b; j++) {
            c.m[i][j] = g.m[i][j] * t;
        }
    }
    return c;
}
Vect Multiply(const Vect& w, int t) {
    Vect c(w);
    for (int i = 0; i < w.a; i++) {
        c.v[i] = w.v[i] * t;
    }
    return c;
}
Vect Multiply(const Matr& g, const Vect& w) {
    Vect f(g.a);
    if (g.b!=w.a)
    {
        cout << "Error" << endl;
        return f;
    }
    else {
        for (int j = 0; j < g.a; j++)
        {
            f.v[j] = 0;
            for (int i = 0; i < g.a; i++)
                f.v[j] += w.v[i] * g.m[i][j];
        }
        return f;
    }
}
Matr Multiply(const Matr& g, const Matr& f) {
    int a = f.a;
    int b = g.b;
    Matr p(b, a);
    if (g.b != f.a) {
        return p;
    }
    for (int i = 0; i < f.a; i++)
    {
        for (int j = 0; j < g.b; j++)
        {
            p.m[i][j] = 0;

            for (int k = 0; k < g.a; k++)
            {
                p.m[i][j] += g.m[i][k] * f.m[k][j];
            }
        }
    }
    return p;
}

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

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

Я разобрался в чем ошибка дело в том что создается матрица вот такая Matr p (g.a, f,b) при этом циклы вот такие:

for (int i = 0; i < g.a; i++)
    {
        for (int j = 0; j < f.b; j++)
        {
            p.m[i][j] = 0;

            for (int k = 0; k < f.a; k++)
            {
                p.m[i][j] += g.m[i][k] * f.m[k][j];
            }
        }
    }
→ Ссылка