我是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
被malloc'ed两次,它们之间是空闲的。这可能是错误的原因吗?我以前从来没有这样做过,希望我正在犯一些简单的错误......
更新1
只是想特别注意使用gdb我会通过第一个freeoc和第二个malloc来执行代码,所以我知道代码会通过这些步骤。
如果上面的设计模式不是问题,那么还有什么其他情况会导致free()
导致此错误?
答案 0 :(得分:2)
您显示的代码没有明显错误。特别是代码模式
x = malloc(n);
...
if (condition) {
free(x);
x = malloc(m);
}
...
free(x);
本身并没有错。
您几乎可以肯定在不显示的代码中的某个地方犯了一个简单的错误,这会导致内存损坏。幸运的是,有一个很好的工具可以自动发现这样的错误:它被称为valgrind
。在此工具下运行您的程序。修复它告诉您的第一个错误。重复,直到它告诉您没有其他错误。 (通常只有valgrind的第一个投诉反映了你的代码中的一个真正的错误;所有后续的投诉都“仅仅”从最初的不良内存访问中产生影响。)
答案 1 :(得分:1)
将变量释放两次就可以了,只要你在它们之间单独进行mallocing即可。我怀疑问题是你实际上并没有在它们之间进行mallocing - 一些逻辑开关(如果/ else / while)阻止malloc
发生,因此free
在同一时间发生两次指针。