0

我只是想确保我正确理解了这一点。虽然下面的函数将动态分配的指针返回到一个指针的副本,但由于副本也绑定到同一个内存,所以当我删除副本时,原始副本也会删除。

类似地,传递给函数的AB矩阵作为副本传递,但因为它们指向相同的内存,所以最后一次删除就足够了。

#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

0

说“矩阵作为副本传递”有点误导,但你的代码是正确的,我认为你对它为什么正确有正确的想法。

传递给函数的实际上是两个int**,因此两个指向int*s 的指针和一个int. 所有这些都是按值传递的,所以在某种意义上,作为一个副本。如果您A在函数内部进行了修改,则函数之外的任何内容都不会注意到。(如果你修改了,A[5]或者A[3][4]虽然,那传播!)

于 2013-09-17T19:24:36.033 回答
0

你猜对了。事实是您返回并将指针的副本传递到同一内存区域,因此当您调用 delete[] 时,您正在释放您期望的内容。

于 2013-09-17T19:24:54.273 回答