с++ удалить из матрицы нечетные строки, передвинув на их место следующие

Задача: удалить из матрицы 5х7 строки, сумма элементов которых нечетна, передвинув на их место следующие, без нарушения порядка их следования. Я создал матрицу, посчитал её элементы, но с логикой перемещения элементов какая-то беда. Матрица остается без изменений при выводе.

#include <iostream>
#include <cstdlib>
using namespace std;

int** createMatrix(int row, int col);
void fillingMatrix(int** matrix, int row, int col);
int** countRowMatrix(int** matrix, int row, int col);
void deletingRow(int** matrix, int row, int counting);
void showMatrix(int** matrix, int row, int col);

static int countDeleting = 0; //считаем сколько строк нужно удалить по итогу

int main()
{
    int row, col;
    setlocale(LC_ALL, "Russian");
    cout << "введите количество строк: ";
    cin >> row;
    cout << "введите количество столбцов: ";
    cin >> col;
    int** matrix;
    matrix = createMatrix(row, col);
    fillingMatrix(matrix, row, col);
    cout << "before" << endl;
    showMatrix(matrix, row, col);
    int** newmatrix = createMatrix(row, col);
    newmatrix = countRowMatrix(matrix, row, col);
    cout << "afrer:" << endl;
    showMatrix(newmatrix, row, col);
    cout << countDeleting;
}

int** createMatrix(int row, int col)
{
    int** matrix; //двумерный указатель
    matrix = new int* [row];
    for (int i = 0; i < col; i++) { //для каждого элемента создаем "следующий уровень" вложенности
        matrix[i] = new int[col];
    }
    return matrix;
}

void fillingMatrix(int** matrix, int row, int col)
{
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            matrix[i][j] = rand(); //случайные значения
        }
    }
}

int** countRowMatrix(int** matrix, int row, int col)
{
    int sum = 0; 
    for (int i = 0; i < row; i++) { //i - номер текущей строки
        for (int j = 0; j < col; j++) {
            sum = sum + matrix[i][j];
        }
        if (sum % 2 == 1) {//если сумма значений текущей строки удовлетворяет условию, то
            countDeleting++;
            for (int nrow = i+1; i < row; i++) {
                for (int ncol = col; ncol < col; ncol++) {
                    matrix[nrow - 1][ncol] = matrix[nrow][ncol];
                }
            }
        }
        sum = 0;//обнуляем значение суммы
    }
    
    return matrix;
}

void deletingRow(int** matrix, int row, int counting) 
{
    int newrow = row - counting; //новое количество строк в матрице
    for (int i = row; i > newrow; i--) {
        delete[] matrix[i];
    }
}

void showMatrix(int** matrix, int row, int col)
{
    int sum=0;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << matrix[i][j] << '\t';
            sum += matrix[i][j];
        }
        cout << sum;
        cout << endl;
    }
}

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

Автор решения: Igor
        for (int nrow = i+1; nrow < row; nrow++) {
                             ^^^^        ^^^^ 
→ Ссылка
Автор решения: vlad9i2

Матрица остаётся без изменений т.к. в вашем цикле путаница с переменными.

int** countRowMatrix(int** matrix, int row, int col)
{
    int64_t sum = 0; 
    for (int i = 0; i < row - countDeleting; i++) { //i - номер текущей строки
        for (int j = 0; j < col; j++) {
            sum = sum + matrix[i][j];
        }
        if (sum % 2 == 1) {//если сумма значений текущей строки удовлетворяет условию, то
            countDeleting++;
            for (int nrow = i + 1; nrow < row; nrow++) {
                for (int ncol = 0; ncol < col; ncol++) {
                    matrix[nrow - 1][ncol] = matrix[nrow][ncol];
                }
            }
            i--;
        }
        sum = 0;//обнуляем значение суммы
    }
    
    return matrix;
}

Ещё у вас в showMatrix сумма строк не обнуляется после каждой итерации.

Также в этих строках:

int** newmatrix = createMatrix(row, col);
newmatrix = countRowMatrix(matrix, row, col);

Вы навсегда потеряете указатель на выделенную доп. память в createMatrix и у вас утечёт память.

→ Ссылка