从以下设计模式中获取与malloc相关的错误:malloc / free / malloc / free

时间:2012-11-10 02:51:37

标签: c malloc

我是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()导致此错误?

2 个答案:

答案 0 :(得分:2)

您显示的代码没有明显错误。特别是代码模式

x = malloc(n);
...
if (condition) {
    free(x); 
    x = malloc(m);
}
...
free(x);

本身并没有错。

您几乎可以肯定在显示的代码中的某个地方犯了一个简单的错误,这会导致内存损坏。幸运的是,有一个很好的工具可以自动发现这样的错误:它被称为valgrind。在此工具下运行您的程序。修复它告诉您的第一个错误。重复,直到它告诉您没有其他错误。 (通常只有valgrind的第一个投诉反映了你的代码中的一个真正的错误;所有后续的投诉都“仅仅”从最初的不良内存访问中产生影响。)

答案 1 :(得分:1)

将变量释放两次就可以了,只要你在它们之间单独进行mallocing即可。我怀疑问题是你实际上并没有在它们之间进行mallocing - 一些逻辑开关(如果/ else / while)阻止malloc发生,因此free在同一时间发生两次指针。