0

これを正しく理解していることを確認したいだけです。以下の関数は動的に割り当てられたポインターのコピーをポインターに返しますが、コピーも同じメモリにバインドされているため、コピーを削除すると元のも削除されます。

同様に、関数に渡される行列Aと行列はコピーとして渡されますが、それらは同じメモリを指しているため、最後に 1 つの削除で十分です。B

#include <iostream>
#include "print.h"
int** square_matrix_multiply(int** A, int** B, int rows)
{
    int **C;
    C = new int *[rows];
    for(int i = 0; i < rows; i++) {
        C[i] = new int[rows];
        for(int j = 0; j < rows; j++) {
            C[i][j] = 0;
            for(int k = 0; k < rows; k++)
                C[i][j] += A[i][k]*B[k][j];
        }
    }
    return C;
}
int main()
{
    size_t sz = 6;
    int **A, **B;
    A = new int *[sz];
    B = new int *[sz];
    for(int i = 0; i < sz; i++) {
        A[i] = new int[sz];
        B[i] = new int[sz];
        for(int j = 0; j < sz; j++) {
            A[i][j] = rand() % 100;
            B[i][j] = rand() % 100;
        }
    }
    int** M = square_matrix_multiply(A, B, sz);
    for(int i = 0; i < sz; i++) {
        delete[] A[i];
        delete[] B[i];
        delete[] M[i];
    }
    delete[] A, delete[] B, delete[] M;
    return 0;
}
4

2 に答える 2