gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:40 35 4
gpt4 key购买 nike

我是 C 的新手,在 Linux 中使用带有开关 gcc -g -std=c89 -Wall ... 的 gcc4.4.6 进行编程,我在许多函数深处遇到了这个错误我的程序名为 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 单步执行代码,此错误出现在代码的第 2 行:free(JDP)。执行过程中,数组 JDP 被 malloc 两次,两次之间有一个 free。这可能是错误的原因吗?我以前从未这样做过,希望我犯了一些简单的错误...

更新 1

只是想特别注意,使用 gdb 我确实通过第一个 free 和第二个 malloc 逐步执行代码,所以我知道代码通过了这些步骤。

如果上面的设计模式没有问题,还有哪些场景会导致 free() 导致这个错误?

最佳答案

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

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

本身并没有错。

几乎可以肯定,您在没有显示的代码中的某个地方犯了一个简单的错误,这导致了内存损坏。幸运的是,有一个出色的工具可以自动发现此类错误:它叫做 valgrind。 .在此工具下运行您的程序。 首先 修复它告诉您的错误。重复直到它告诉您没有进一步的错误。 (通常只有 valgrind 的第一个提示反射(reflect)了代码中的真正错误;所有后续的提示“仅仅是”原始错误内存访问的后果。)

关于c - 从 : malloc/free/malloc/free 的设计模式中获取与 malloc 相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318763/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com