首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归函数中的内存泄漏

递归函数中的内存泄漏
EN

Stack Overflow用户
提问于 2012-11-11 17:34:48
回答 2查看 2.3K关注 0票数 6

这是我用C语言实现的Cooley-Tukey算法的一个片段,是的,这是大学作业。但不管怎样。该算法运行良好,但我必须释放ar1和ar2,以消除大量输入数据上的巨大内存泄漏,但每次尝试时,我都会得到无效的读取。理论上,ar1和ar2应该只由函数的当前实例使用,而且它们应该是唯一的,因为每个实例都有自己的错误定位输出。

代码语言:javascript
运行
复制
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说:

代码语言:javascript
运行
复制
==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试图访问该内存。你知道到底是怎么回事吗?我怎么才能摆脱泄密呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-11 17:43:57

你说“每个实例错误地锁定自己的输出”,但在下面的语句中并非如此:

代码语言:javascript
运行
复制
if(N == 1)
    return from;

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

我怎样才能摆脱泄漏?

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

票数 8
EN

Stack Overflow用户

发布于 2012-11-11 17:42:27

解决这些问题的最好方法是清楚地定义前置条件和后置条件。你认为返回的结果已经被恶意锁定了吗?如果是这样的话,你通过返回"from“和没有释放"ar2”似乎违反了这一点。如果您假设返回的结果不是错误锁定的,那么您需要确保此内存是由调用者提供的,而且不会返回错误锁定的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13329968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档