因此,目前我正在使用一个为项目编写的小矩阵库,但我讨厌的是如何使用临时变量来存储指向矩阵的指针,以避免内存泄漏
例子:

matrix_t* matrix_add(matrix_t* m1, matrix_t* m2)
{
    assert(m1 != NULL && m2 != NULL);
    assert(m1->rows > 0 && m2->rows > 0 && m1->cols > 0 && m2->cols > 0);
    assert(m1->rows == m2->rows && m1->cols == m2->cols);

    matrix_t* sum = matrix_constructor(m1->rows, m1->cols);

    int i, j;
    for(i=0; i<m1->rows; i++)
    {
        for(j=0; j<m1->cols; j++)
        {
            matrix_set(sum, i, j, matrix_get(m1, i, j) + matrix_get(m2, i, j));
        }
    }
    return sum;
}

所以你可以看到,如果我想像2矩阵加法(A+B+C)那样把操作连在一起,那么我必须做如下事情:
matrix_t* temp = matrix_add(A, B);
matrix_t* sum = matrix_add(temp, C);
free_matrix(temp);

当有一个长的操作链时,这也会变得更加难看,因为每个操作都需要一个临时变量。我的问题是,是否有人有任何设计策略,可以通过链接操作和避免内存泄漏,使我的生活更轻松和代码更干净。
我想我可以用可变长度的操作发送可变长度的参数,但是当引入许多不同的操作(如矩阵转置和需要不同大小矩阵的操作)时,这可能会变得混乱。

最佳答案

一种解决方案是实现内存池管理器。分配内存时,管理器将指针存储在列表中。当需要清理时,主管会释放列表中的所有内存。
顶层代码看起来像这样

mempool_t *pool = pool_create();
matrix_t *temp, *sum;
temp = matrix_add(pool, A, B);
temp = matrix_add(pool, temp, C);
temp = matrix_add(pool, temp, D);
sum  = matrix_add(pool, temp, E);
pool_destroy(pool, sum);
// ...
// use sum for something
// ...
free(sum);

函数创建一个数据结构来跟踪所有的内存分配。这可以是一个链接列表,也可以是一个可调整大小的数组。
pool_create函数将matrix_add传递给构造函数
matrix_t *sum = matrix_constructor(pool, m1->rows, m1->cols);

pool将分配的内存添加到池中
matrix_t *ptr = malloc(...);
pool_add(pool, ptr);

matrix_constructor函数对列表中的每个指针调用pool_destroy,但作为第二个参数传递的指针除外。因此在本例中,free不会被释放,稍后必须由顶级代码释放。

07-28 03:05
查看更多