I am trying to write a matrice class in c++ with a overloaded + operator that is a friend function for summing a matrix with a number, ie sum every element of the matrice with the number.
for example:-
2+ |1|2|  = |3|4|
   |2|1|    |4|3|
main.cpp :-
#include <iostream>
using namespace std;
class matrice {
    int** a;
    int rows, columns, i, j;
public:
    matrice() {}
    matrice(matrice& A) { //copy constructor for deep copying the result of 2+A into C
        rows = A.rows;
        columns = A.columns;
        a = new int* [rows];
        for (i = 0; i < rows; i++) {
            a[i] = new int[columns];
            *a[i] = 0;
        }
        for (i = 0; i < rows; i++) {
            for (j = 0; j < columns; j++) {
                a[i][j] = A.a[i][j];
            }
        }
    }
    matrice(int m, int n) {
        rows = m;
        columns = n;
        a = new int* [rows];
        for (i = 0; i < rows; i++) {
            a[i] = new int[columns];
            *a[i] = 0;
        }
    }
    ~matrice() {
        delete[] a;
    }
    void insert(int p, int q, int value) {
        a[p][q] = value;
    }
    void print() {
        for (i = 0; i < rows; i++) {
            cout << "\n";
            for (j = 0; j < columns; j++) {
                cout << a[i][j] << " ";
            }
        }
    }
    friend matrice operator+(int k, matrice& A);
    friend matrice operator+(matrice& A, int k);
};
matrice operator+(int k, matrice& A) { //for performing 2+A
    matrice temp(A.rows, A.columns);
    for (int i = 0; i < A.rows; i++) {
        for (int j = 0; j < A.columns; j++) {
            temp.a[i][j] = A.a[i][j] + k;
        }
    }
    return temp;
}
matrice operator+(matrice& A, int k) {  //for performing A+2
    matrice temp(A.rows, A.columns);
    for (int i = 0; i < A.rows; i++) {
        for (int j = 0; j < A.columns; j++) {
            temp.a[i][j] = A.a[i][j] + k;
        }
    }
    return temp;
}
int main() {
    int i, j, m, n, value;
    cout << "\nEnter order of A matrice:";
    cin >> m >> n;
    matrice A(m, n);
    cout << "\nEnter the matrice:";
    for (i = 0; i < m; i++) {
        cout << "\nEnter row " << i + 1 << " : ";
        for (j = 0; j < n; j++) {
            cin >> value;
            A.insert(i, j, value);
        }
    }
    cout << "\nThe entered matrice is :";
    A.print();
    cout << "\n\n";
    cout << "\nEnter order of B matrice:";
    cin >> m >> n;
    matrice B(m, n);
    cout << "\nEnter the matrice:";
    for (i = 0; i < m; i++) {
        cout << "\nEnter row " << i + 1 << " : ";
        for (j = 0; j < n; j++) {
            cin >> value;
            B.insert(i, j, value);
        }
    }
    cout << "\nThe entered matrice is :";
    B.print();
    cout << "\n\ntesting 2+A"; 
    matrice C; //Everything upto here is fine
    C = A + 2; // C.a is pointing to unreadable memory because of destruction after doing A+2 
    C.print(); // so access violation error
}
The problem is that the destructor of C is called after invoking the copy constructor which causes the double pointer a in C to be deleted. So when C.print() is called An Access violation reading location 0xDDDDDDDD exception is thrown.
I can't find out why C's destructor is called.
 
    