gpt4 book ai didi

c - 函数没有及时释放

转载 作者:行者123 更新时间:2023-12-04 11:00:48 25 4
gpt4 key购买 nike

我已经查看了关于 SO 的其他一些问题,但似乎没有一个解决了类似的问题。

我有一个函数可以对数组进行排序(使用堆排序)并计算中位数。堆排序例程直接取自 Numerical Recipies。

我正在 callocing 和 freeing 中值函数内的数组,但 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 的问题吗?我是否过于频繁地freeing 和callocing?我不知道从哪里开始调试这个。任何帮助都会很棒!

免责声明:带有实际代码的计算机无法访问互联网。我在这里尽可能准确地复制了导致问题的代码。如果有任何遗漏的分号等,那是我的错,原始代码中肯定没有。

编辑:修复了一些转录错误。我会尽快尝试获取原始代码,但从我浏览它们的角度来看,现在这似乎没问题。

最佳答案

问题是对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com