我对 C 比较陌生,并且已经编码(或更准确地说:从 here 复制并改编)了以下函数。第一个获取 numpy 数组并将其转换为 C int 数组:
int **pymatrix_to_CarrayptrsInt(PyArrayObject *arrayin) {
int **result, *array, *tmpResult;
int i, n, m, j;
n = arrayin->dimensions[0];
m = arrayin->dimensions[1];
result = ptrvectorInt(n, m);
array = (int *) arrayin->data; /* pointer to arrayin data as int */
for (i = 0; i < n; i++) {
result[i] = &array[i * m];
}
return result;
}
第二个在第一个内使用来分配行 vector 所需的内存:
int **ptrvectorInt(long dim1, long dim2) {
int **result, i;
result = malloc(dim1 * sizeof(int*));
for (i = 0; i < dim1; i++) {
if (!(result[i] = malloc(dim2 * sizeof(int)))){
printf("In **ptrvectorInt. Allocation of memory for int array failed.");
exit(0);
}
}
return result;
}
到目前为止,一切都运行良好。现在我想释放C数组占用的内存。我发现了多个关于如何执行此操作的线程,例如Allocate and free 2D array in C using void , C: Correctly freeing memory of a multi-dimensional array ,或how to free c 2d array 。受到各自答案的启发,我编写了释放函数:
void free_CarrayptrsInt(int **ptr, int i) {
for (i -= 1; i >= 0; i--) {
free(ptr[i]);
}
free(ptr);
}
尽管如此,我发现第一次调用 free
已经失败了 - 无论我让 for 循环向下还是向上。
我寻找失败的free
命令的解释:Can a call to free() in C ever fail?和 free up on malloc fails 。这表明内存分配可能已经存在问题。但是,我的程序完全按预期工作 - 除了内存释放之外。打印所关注的数组表明一切都应该没问题。可能是什么问题?更重要的是:如何正确释放数组?
我在带有 Visual Studio 10 64 位编译器的 Win8 64 位计算机上工作。我将 C 与 python 3.4 64 位一起使用。
感谢您的帮助!
最佳答案
pymatrix_to_CarrayptrsInt()
调用 ptrvectorInt()
并进行此分配
if (!(result[i] = malloc(dim2 * sizeof(int)))){
然后 pymatrix_to_CarrayptrsInt()
使用此赋值覆盖该分配
结果[i] = &array[i * m];
导致内存泄漏。如果array
是free()的,那么尝试free()结果
将会失败
关于C:二维 int 数组行的 free() 使程序停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491372/