C++ Операторы, перегрузка операций

Мне сказали , что не корректная работа с памятью в данном операторе, кто подскажет в чём та самая "не корректная работа"?

Matrix& operator /(Matrix& obj) {
    int k = 0;
    float** arr1;
    float** arr2 = obj.getArr();
    float s1, s2;

    if (N > obj.getN()) {
        N = obj.getN();
    }

    if (M > obj.getM()) {
        M = obj.getM();
    }

    for (int i = 0; i < N; i++) {
        s1 = sr(arr[i], M);
        s2 = sr(arr2[i], M);

        if (s1 > s2) {
            k++;
        }
    }

    if (k > 0) {
        int z = 0;
        arr1 = new float* [k];
        for (int i = 0; i < k; i++) {
            arr1[i] = new float[M];
        }

        for (int i = 0; i < N; i++) {
            s1 = sr(arr[i], M);
            s2 = sr(arr2[i], M);

            if (s1 > s2) {
                arr1[z] = arr[i];
                z++;
            }
        }
        //print(arr2, k, M);
    }
    else {
        arr1 = arr2;
        k = obj.getN();
        M = obj.getM();
    }

    Matrix* x = new Matrix(arr1, k, M);
    
    for (int i = 0; i < N; i++) {
        delete[]arr1[i];
    }
    delete[]arr1;

    return *x;
}

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

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

Как минимум, вы создаете динамически объект

Matrix* x = new Matrix(arr1, k, M);

после чего возвращаете его как

return *x;

Т.е. создается и возвращается копия объекта. Указатель на исходный объект теряется, и вы получаете утечку памяти.

Возможно, есть и другие неприятности, но маловато кода (например,

float** arr2 = obj.getArr();

кто здесь владеет выделенной памятью? кто должен ее освобождать? Без полного кода непонятно), а этот возврат - первое, что просто бросается в глаза...

Кстати, судя по

arr1 = arr2;

в ветви else с последующим освобождением arr1 - если проходит первая ветвь, arr2 так и остается не освобожденным - очень похоже, что и тут утечка памяти...

→ Ссылка