首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从设计模式获取与malloc相关的错误: malloc / free /malloc/ free

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

Stack Overflow用户
提问于 2012-11-10 10:51:37
回答 2查看 176关注 0票数 1

我是个C新手,使用带有开关gcc -g -std=c89 -Wall ...的gcc4.4.6在Linux中编程,在我的名为compute的程序中的许多函数中都遇到了这个错误

代码语言:javascript
复制
*** 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: ========
...

下面是一些伪代码(代码非常长,所以我只在这里展示其结构):

代码语言:javascript
复制
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()导致这个错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-10 10:58:24

您所显示的代码没有明显的错误。尤其是代码模式

代码语言:javascript
复制
x = malloc(n);
...
if (condition) {
    free(x); 
    x = malloc(m);
}
...
free(x);

本身并不是错误的。

几乎可以肯定的是,您在没有显示的代码中的某个地方犯了一个简单的错误,这导致了内存损坏。幸运的是,有一个很好的工具可以自动发现这样的错误:它叫做valgrind。在这个工具下运行你的程序。修复它告诉你的第一个错误。重复此操作,直到它告诉您不再出现错误。(通常只有valgrind的第一个抱怨反映了代码中的一个真正的bug;所有随后的抱怨都“仅仅”是最初错误的内存访问造成的。)

票数 2
EN

Stack Overflow用户

发布于 2012-11-10 10:55:24

释放变量两次是很好的,只要你在它们之间是错位的。我怀疑问题并不是你实际上在它们之间错位了--一些逻辑开关(if/else/while)阻止了malloc的发生,因此free在同一个指针上出现了两次。

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

https://stackoverflow.com/questions/13318763

复制
相关文章

相似问题

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