所以目前我正在使用我为项目编写的小矩阵库,但我讨厌的是我需要如何使用临时变量来存储指向矩阵的指针以避免内存泄漏
例:
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
函数将pool
传递给构造函数
matrix_t *sum = matrix_constructor(pool, m1->rows, m1->cols);
matrix_constructor
将分配的内存添加到池中
matrix_t *ptr = malloc(...);
pool_add(pool, ptr);
pool_destroy
函数对列表中的每个指针调用 free
,但作为第二个参数传递的指针除外。因此,在示例中,sum
不会释放,并且必须稍后由顶级代码释放。