这是我用 C 语言实现 Cooley-Tukey 算法的一个片段。是的,这是大学作业。但无论如何......该算法工作正常,但我必须释放 ar1 和 ar2 以消除大量输入数据上的巨大内存泄漏,但每次我尝试时,我都会得到无效读取。理论上,ar1 和 ar2 应该只由函数的当前实例使用,并且它们应该是唯一的,因为每个实例都分配自己的输出。
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 会尝试访问该内存。知道实际发生了什么以及如何摆脱泄漏吗?