首页 > 解决方案 > 使用方法链接时释放指针的正确方法

问题描述

我目前正在用 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**矩阵指针的事实已经是一个糟糕的设计选择?

标签: cmemory-managementfree

解决方案


问题是 C 没有自动析构函数调用的概念,就像 C++ 一样。因此,AFAIK,作为程序员,您有责任释放已分配的任何内容。

当然,您可以想象一个库,它保留对它分配的任何内容的引用,并提供一种在您不再需要它时释放它的方法。例如,您可以实现一个动态堆栈来存储每个新分配的内存块,然后使用该堆栈来回收整个内存。

只是我懒得写它的实现......但如果你觉得你想这样做但不能从一开始就实现它,请随时在评论中联系我。


推荐阅读