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