我是个C新手,使用带有开关gcc -g -std=c89 -Wall ...的gcc4.4.6在Linux中编程,在我的名为compute的程序中的许多函数中都遇到了这个错误
*** glibc detected *** ./compute: corrupted double-linked list: 0x0000000001a770b0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x366d475916]
/lib64/libc.so.6[0x366d4786a4]
./compute[0x406987]
./compute[0x407f0d]
./compute[0x408a41]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x366d41ecdd]
./compute[0x401769]
======= Memory map: ========
...下面是一些伪代码(代码非常长,所以我只在这里展示其结构):
myPts = 100;
JDP = malloc( sizeof(double) * myPts);
if (JDP == NULL)
exit(27);
...
if (testCondition == 1) { /* my execution enters this if stmt here */
...
myPts = 200;
free(JDP);
JDP = malloc (sizeof(double) * myPts);
if (JDP == NULL)
exit(27);
myFunction(JDP, ...); /* array JDP is populated here */
...
} else {
JDP[0]=0;
}
myOtherFunction(..., JDP, ...); /* array JDP is used here */
free(JDP); /* this line produces error shown above */
return 0;使用gdb遍历代码,在代码的第二行产生这个错误:free(JDP)。执行过程中,数组JDP被恶意锁定两次,两次之间有一个空闲空间。这可能是错误的原因吗?我以前从来没有这样做过,希望我犯了一些简单的错误...
更新1
我只想特别指出,使用gdb时,我确实通过了第一个free和第二个malloc来逐步执行代码,所以我知道代码会通过这些步骤。
如果上面的设计模式不是问题,那么还有什么场景会导致free()导致这个错误呢?
发布于 2012-11-10 10:58:24
您所显示的代码没有明显的错误。尤其是代码模式
x = malloc(n);
...
if (condition) {
free(x);
x = malloc(m);
}
...
free(x);本身并不是错误的。
几乎可以肯定的是,您在没有显示的代码中的某个地方犯了一个简单的错误,这导致了内存损坏。幸运的是,有一个很好的工具可以自动发现这样的错误:它叫做valgrind。在这个工具下运行你的程序。修复它告诉你的第一个错误。重复此操作,直到它告诉您不再出现错误。(通常只有valgrind的第一个抱怨反映了代码中的一个真正的bug;所有随后的抱怨都“仅仅”是最初错误的内存访问造成的。)
发布于 2012-11-10 10:55:24
释放变量两次是很好的,只要你在它们之间是错位的。我怀疑问题并不是你实际上在它们之间错位了--一些逻辑开关(if/else/while)阻止了malloc的发生,因此free在同一个指针上出现了两次。
https://stackoverflow.com/questions/13318763
复制相似问题