C:二维 int 数组行的 free() 使程序停止

标签 c arrays memory numpy free

我对 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/

相关文章:

c - 多处理程序未提供所需的输出

c# - 在单个事务中恢复多个模式 - Postgres

c - 在这种情况下如何释放内存?

c++ - 清除在C++中堆栈中分配的内存

IOSurface 在 iOS 12 及以上版本逐渐增加内存

c - 为什么我不能在 while 中使用整个 char[]?

c - 在 linux 内核驱动程序中向平台设备添加属性

arrays - 编写进度条,直到Get-Job返回 “Running” PowerShell

ruby - 在这种情况下,正则表达式比数组比较快吗?

python - 同时并行读取 numpy 数组