C:2d int数组行的free()使程序暂停

C:2d int数组行的free()使程序暂停,c,arrays,memory,numpy,free,C,Arrays,Memory,Numpy,Free,我是C语言的新手,已经编写了(或者更准确地说,是从C语言复制并改编的)下面的函数。第一个接受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];

我是C语言的新手,已经编写了(或者更准确地说,是从C语言复制并改编的)下面的函数。第一个接受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;
}
尽管如此,我发现第一次调用
free
已经失败了——不管我是让for循环下降还是上升

我寻找失败的
free
命令的解释:和。这表明,内存分配可能已经出现问题。然而,我的程序完全按照预期工作——除了释放内存。打印阵列表明一切正常。可能是什么问题?更重要的是:如何正确释放阵列

我在一台带有Visual Studio 10 64位编译器的Win8 64位机器上工作。我将C与python 3.4 64位结合使用


谢谢你的帮助

pymatrix\u to_CarrayptrsInt()
调用
ptrvectorInt()
并进行此分配
如果(!(结果[i]=malloc(dim2*sizeof(int)){

然后
pymatrix\u to_CarrayptrsInt()
使用此分配写入该分配
result[i]=&array[i*m];


导致内存泄漏。如果
数组
可用()'d,则尝试释放()
result
将失败

我认为@user3121023是正确的;由于丢失了指向已分配内存的指针,此分配不仅会导致内存泄漏,还尝试调用存储在
result
中的指针的
free
,但它们没有指向已分配的内存,因为它们是从
数组中获取的in->data
。感谢您对user3121023和@szczurcio的评论。我想我并没有正确理解所有内容,但最终找到了一个有效的解决方案。如果您能查看我对user3121023答案的评论,以确保我对所有内容都理解清楚,我会很高兴。我有点担心我的解决方案之所以有效,是因为祝你好运,并将导致以后或其他机器上的内存泄漏…我不确定我是否正确理解你。我这样理解你,语句
if(!(result[I]=malloc(dim2*sizeof(int)))
是不必要的,甚至是有害的。此外,我不需要检查
ptr
的所有条目,只需要释放
ptr
本身。因此,我删除了相应的行(即
ptrvectorInt
中的
for
循环和
free\u CarrayptrsInt
)。我的程序运行良好,内存使用保持不变。对我来说,问题似乎就这样解决了。这些是你建议的更改吗?还是我仍然在做一些错误或有风险的事情?谢谢你的回答,@user3121023!
arrayin->data
与一个python对象相关,该对象的内存由python管理。因此,它将永远不要被释放。因为性能对我的程序很重要,我不喜欢复制这些值。
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;
}
void free_CarrayptrsInt(int **ptr, int i) {

    for (i -= 1; i >= 0; i--) {
        free(ptr[i]);
    }
    free(ptr);
}