我只是想确保我正确理解这一点。虽然下面的函数返回动态分配指针的副本,但由于副本也绑定到同一个内存,因此当我删除副本时,原始文件也会删除。
类似地,传递给函数的A
和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;
}
答案 0 :(得分:0)
说“矩阵作为副本传递”有点误导,但你的代码是正确的,我认为你对它的正确性有正确的认识。
传递给函数的内容实际上是两个int**
,因此指向int*
的两个指针和一个int
。所有这些都是通过值传递的,所以在某种意义上,作为副本。如果您在函数内部修改了A
,则函数外部不会注意到任何内容。 (如果你修改了A[5]
或A[3][4]
,那会传播!)
答案 1 :(得分:0)
你猜对了。事实是,您返回并将指针的副本传递到同一个内存区域,因此当您调用delete []时,您将取消分配您期望的内容。