【发布时间】:2019-09-23 08:21:35
【问题描述】:
我目前正在用 c 编写多种不同的矩阵乘法实现。所以我写了矩阵加减的实用函数,结构如下:
int** m_sub(int** a, int** b, int size) {
int **result = get_matrix(size);
// calculate addition of a & b
return result;
}
get_matrix():
int** get_matrix(int size){
int** m = malloc(size*sizeof(int));
for (int i=0;i<size;i++){
m[i] = malloc(size*sizeof(int));
}
return m;
}
我设计了所有可以使用并返回 int** 的函数,因为据我了解,您不能在 c 中返回可变大小的二维数组。
现在程序可以正常工作,但是通过运行内存检查器(Valgrind),我发现调用的所有返回值,例如m_add 导致内存泄漏,因为我在方法链接中直接使用返回值,而我没有 free() 它们,例如:
m_copy(c_11,m_add(matmul_recursive(n/2, a,e),matmul_recursive(n/2, b, g), n/2), n/2);
我知道我可以通过将每个返回的 int** 分配给一个变量并随后手动释放它来解决此问题。但是,这将导致大量临时分配的变量,因此(可以说)代码的可读性降低。
现在我想知道在 c 中是否有“正确”的方式来做到这一点?还是我返回矩阵的 int** 指针这一事实已经是一个糟糕的设计选择?
【问题讨论】:
-
你不能反过来做吗?循环释放
m[i]指针,最后释放**m? -
(@Inian 表示循环中的
free (m[i]);,然后是free (m);) -
是的,我知道如何通过循环释放从
get_matrix()获得的矩阵。问题更多的是“即使我没有将返回的int**分配给变量而是直接将其用作另一个函数的参数,我是否可以释放它们?” -
int** m = malloc(size*sizeof(int));是非常错误的,它假定指针的大小是整数的大小。它应该是int **m = malloc(size * sizeof *m);,即sizeof (int *),但不重复类型,并对相关变量进行一点“锁定”。
标签: c memory-management free