我看过关于SO的其他一些问题,但似乎都没有解决类似的问题。
我有一个对数组排序(使用堆排序)并计算中位数的函数。堆排序例程直接取自“数值食谱”。
我在中值函数内calloc
和free
数组,但free
似乎并没有及时释放空间。这是一些代码来说明我的意思:
int calcMedian(int n1, int n2, int *dat)
{
int ii, npt;
int *inparr, retval;
npt = n2 - n1 + 1; /* Number of elements in array */
inparr = calloc(npt+1, sizeof(*inparr));
for(ii = n1; ii <= n2; ii++)
inparr[ii-n1+1] = dat[ii]; /* ii-n1+1 because heapsort function likes arrays to
start from 1 */
heapsortInt(npt, inparr); /* The error isn't here, function has been previously
debugged. Sorting is in-place.*/
if (npt % 2)
retval = inparr[(npt+1)/2];
else
retval = (inparr[npt/2]+inparr[npt/2+1])/2;
free(inparr);
return(retval);
}
函数
heapsortInt
已被完全调试,并已在其他几个地方使用而没有问题。现在,我像这样在循环中调用函数calcMedian
:for(ii = 0; ii < maxval; ii++) {
index = ii * maxpt;
med1 = calcMedian(index, index+npt1[ii]-1, data1+index);
med2 = calcMedian(index, index+npt2[ii]-1, data2+index);
}
相关变量定义如下:
int *data1, *data2;
int *npt1, *npt2;
data1 = calloc(maxval * maxpt, sizeof(*data1));
data2 = calloc(maxval * maxpt, sizeof(*data2));
npt1 = calloc(maxval, sizeof(*npt1));
npt2 = calloc(maxval, sizeof(*npt2));
因此,我基本上是将一个大型数组的不同部分传递到
calcMedian
并获取必要的中值。问题:
calcMedian
碰到第二个函数调用时似乎崩溃了。我通过valgrind来运行它,这就是告诉我的:Invalid read of size 4
at 0x43F67E: calcMedian /* Line no. pointing to calloc in calcMedian */
by 0x4416C9: main /* Line no pointing to second call of calcMedian */
Address 0x128ffdc0 is 6,128 bytes inside a block of size 110,788 free'd
at 0x4A063F0: free
by 0x43F728: calcMedian /* Line no. pointing to free in calcMedian */
by 0x4416C9: main /* Line no pointing to first call of calcMedian */
这是
free
的问题吗?我free
和calloc
太频繁了吗?我不知道从哪里开始调试。任何帮助都会很棒!免责声明:具有实际代码的计算机无法访问Internet。我在这里尽可能准确地复制了导致问题的代码。如果有任何遗漏的分号等,这是我的错,那么原始代码中肯定没有。
编辑:修复了一些转录错误。我将尝试尽快获取原始代码,但是从我的眼神来看,这似乎还不错。
最佳答案
问题是调用calcMedian。
您将两次添加索引,一次在调用中,然后在calcMedian内部。
应该是这样的:
med1 = calcMedian(index, index+npt1[ii]-1, data1);
med2 = calcMedian(index, index+npt2[ii]-1, data2);
关于c - 功能无法及时释放,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20661002/