递归函数中的内存泄漏

时间:2012-11-11 09:34:48

标签: c memory recursion fft memory-leaks

这是我在C中实现Cooley-Tukey算法的片段。是的,它是大学作业。但无论如何......算法工作正常,但我必须释放ar1和ar2来摆脱巨大的输入数据上的巨大内存泄漏,但每次我尝试,我得到无效的读取。理论上,ar1和ar2应仅由函数的当前实例使用,并且它们应该是唯一的,因为每个实例malloc都有自己的输出。

complex_exp * dft(complex_exp * from, int N, int s, int inverse) {

if(N == 1)
    return from;

int i;
complex_exp * transformed = (complex_exp *) malloc(N * sizeof(complex_exp));
complex_exp * ar1 = dft(from, N / 2, 2*s, inverse); //LINE 83
complex_exp * ar2 = dft(from + s, N / 2, 2*s, inverse); // LINE 84

for(i = 0; i < N/2; i++) {

    transformed[i] = ar1[i]; //LINE 88
}

for(i = N/2; i < N; i++) {
    transformed[i] = ar2[i - N/2];
}

//Do stuff with the transformed array - NO reference to ar1 or ar2.

free(ar1); //LINE 113
return transformed;
}

Valgrind说:

==69597== Invalid read of size 8
==69597==    at 0x100000EE6: dft (progtest05.c:88)
==69597==    by 0x100000EA2: dft (progtest05.c:84)
==69597==    by 0x100000E67: dft (progtest05.c:83)
==69597==    by 0x100000E67: dft (progtest05.c:83)
==69597==    by 0x100001A0E: main (progtest05.c:233)
==69597==  Address 0x100007250 is 64 bytes inside a block of size 256 free'd
==69597==    at 0xDCB8: free (vg_replace_malloc.c:450)
==69597==    by 0x1000011E5: dft (progtest05.c:113)
==69597==    by 0x100000E67: dft (progtest05.c:83)
==69597==    by 0x100000E67: dft (progtest05.c:83)
==69597==    by 0x100000E67: dft (progtest05.c:83)
==69597==    by 0x100001A0E: main (progtest05.c:233)

所以看来第83行的dft调用释放了内存,然后下一行的dft调用尝试访问。知道实际发生了什么,以及如何摆脱泄漏?

2 个答案:

答案 0 :(得分:8)

你说&#34;每个实例malloc都有自己的输出&#34;但是在这个陈述中并不是这样:

if(N == 1)
    return from;

当N == 1时,你应该返回from的副本(即malloc新内存,将内容复制到新内存中,然后返回副本)。

  

我怎样才能摆脱泄漏?

我希望你必须在返回转换之前释放ar1和ar2。

答案 1 :(得分:1)

解决这些问题的最佳方法是明确定义前提条件和后置条件。你认为返回的结果是malloc'ed吗?如果是这样,你似乎通过返回“from”并且也没有释放“ar2”来违反这一点。如果你假设返回的结果不是malloc'ed,那么你需要确保调用者已经提供了这个内存,而且还没有返回malloc的内存。