Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 特殊错误与自由_C_Memory_Malloc_Runtime Error_Free - Fatal编程技术网

C 特殊错误与自由

C 特殊错误与自由,c,memory,malloc,runtime-error,free,C,Memory,Malloc,Runtime Error,Free,我目前正在调试一个我已经工作了一段时间的项目,遇到了一些疯狂的错误,涉及free。我不能上传代码,因为没有办法确切地说出问题所在(大约2500行代码被分成22个文件),但我会解释我所知道的 首先,gdb用于整个调试过程。该错误似乎是由调用free引起的。在程序以SIGABRT退出后,我从gdb获得以下错误消息: *** Error in `application': free(): invalid next size (normal): 0x08052008 *** ======= Backtr

我目前正在调试一个我已经工作了一段时间的项目,遇到了一些疯狂的错误,涉及
free
。我不能上传代码,因为没有办法确切地说出问题所在(大约2500行代码被分成22个文件),但我会解释我所知道的

首先,
gdb
用于整个调试过程。该错误似乎是由调用
free
引起的。在程序以
SIGABRT
退出后,我从
gdb
获得以下错误消息:

*** Error in `application': free(): invalid next size (normal): 0x08052008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb7e467e2]
/lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb7e47530]
application[0x8049aef]
application[0x804a8aa]
application[0x8048bee]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb7de9935]
application[0x8048a51]
======= Memory map: ========
08048000-08050000 r-xp 00000000 00:16 1571817    application
08050000-08051000 r--p 00007000 00:16 1571817    application
08051000-08052000 rw-p 00008000 00:16 1571817    application
08052000-08073000 rw-p 00000000 00:00 0          [heap]
b7d9c000-b7db7000 r-xp 00000000 08:01 1309022    /lib/i386-linux-gnu/libgcc_s.so.1
b7db7000-b7db8000 r--p 0001a000 08:01 1309022    /lib/i386-linux-gnu/libgcc_s.so.1
b7db8000-b7db9000 rw-p 0001b000 08:01 1309022    /lib/i386-linux-gnu/libgcc_s.so.1
b7dce000-b7dd0000 rw-p 00000000 00:00 0 
b7dd0000-b7f7d000 r-xp 00000000 08:01 1308997    /lib/i386-linux-gnu/libc-2.17.so
b7f7d000-b7f7f000 r--p 001ad000 08:01 1308997    /lib/i386-linux-gnu/libc-2.17.so
b7f7f000-b7f80000 rw-p 001af000 08:01 1308997    /lib/i386-linux-gnu/libc-2.17.so
b7f80000-b7f83000 rw-p 00000000 00:00 0 
b7f83000-b7fc4000 r-xp 00000000 08:01 1309045    /lib/i386-linux-gnu/libm-2.17.so
b7fc4000-b7fc5000 r--p 00040000 08:01 1309045    /lib/i386-linux-gnu/libm-2.17.so
b7fc5000-b7fc6000 rw-p 00041000 08:01 1309045    /lib/i386-linux-gnu/libm-2.17.so
b7fd9000-b7fdd000 rw-p 00000000 00:00 0 
b7fdd000-b7fde000 r-xp 00000000 00:00 0          [vdso]
b7fde000-b7ffe000 r-xp 00000000 08:01 1308973    /lib/i386-linux-gnu/ld-2.17.so
b7ffe000-b7fff000 r--p 0001f000 08:01 1308973    /lib/i386-linux-gnu/ld-2.17.so
b7fff000-b8000000 rw-p 00020000 08:01 1308973    /lib/i386-linux-gnu/ld-2.17.so
bffdf000-c0000000 rw-p 00000000 00:00 0          [stack]
这似乎像是一个普通的双重自由,但还有更多。当全局指针不包含任何内容时,我倾向于将它们设置为
NULL
,因此即使我双重释放它也不会导致错误。此外,在我的应用程序处理数据加密时,我创建了两个自己的函数,首先覆盖内存,然后释放调用


这个问题是由从超出范围的内存中读取引起的吗?例如,如果我有一个64字节的内存块,并且不小心尝试读取第65个字节,那么在调用free时是否会导致错误?我知道写越界,即使不是立即,也会导致错误

我一整天都在试图找到这个bug,但没有成功。gdb是否为我的案例提供了任何工具(除了中断、步进、继续和观察)?我能看看我的代码在内存分配和管理方面真正做了什么吗?例如,是否有任何方法可以查看在特定指针指向的位置实际分配了多少内存


提前感谢您抽出时间!:)

这似乎是由于覆盖了未分配的内存而导致内存管理损坏


您可能希望使用来分析此问题。

这似乎是由于覆盖了未分配的内存而导致内存管理损坏


您可能希望使用来分析此问题。

@alk已经回答了,但我将此供参考添加为另一个导致自由函数行为不当的罪魁祸首:

如果指向已分配内存块的指针已移动到其他位置: e、 g


free正在尝试释放不再指向已分配内容的指针,并且将始终抛出错误。

@alk已回答,但我将此作为另一个导致free函数行为不当的原因添加供参考:

如果指向已分配内存块的指针已移动到其他位置: e、 g



free试图释放一个不再指向已分配内容的指针,并且将始终抛出错误。

您能显示相关代码吗?正如我所说,问题出现在我的应用程序的特定部分,但可能在任何时候都会导致。我一次又一次地检查那个部件,它工作得很好。只有在作为一个整体工作时,程序才会崩溃。我无法上传22个文件!:D“从超出范围的内存中读取数据会导致此问题吗?”当然是的,我经常看到这种情况,您是否已经尝试使用
valgrind
?我会怀疑你是在为释放的内存写东西,或者是在分配的缓冲区之外写东西。“我整天都在试图找到这个bug…”这是一个不合理的建议:休息一下,好好吃顿饭,或者看一部好电影,或者你的女孩/男孩,然后睡觉。。然后再重新开始调试,最好使用Valgrind.;-)您能显示相关代码吗?正如我所说,问题出现在我的应用程序的特定部分,但可能在任何时候都会引起。我一次又一次地检查那个部件,它工作得很好。只有在作为一个整体工作时,程序才会崩溃。我无法上传22个文件!:D“从超出范围的内存中读取数据会导致此问题吗?”当然是的,我经常看到这种情况,您是否已经尝试使用
valgrind
?我会怀疑你是在为释放的内存写东西,或者是在分配的缓冲区之外写东西。“我整天都在试图找到这个bug…”这是一个不合理的建议:休息一下,好好吃顿饭,或者看一部好电影,或者你的女孩/男孩,然后睡觉。。然后再重新开始调试,最好使用Valgrind.;-)你能详细介绍一下valgrind吗?valgrind通过在沙箱中运行来观察你的程序。明天你可能会想在这里读到:@angel:尝试在有问题的行中添加换行符,以便每个变量都位于自己的行中。C不关心换行符。然后重新编译。谢谢你的帮助!我完成了调试,所有的错误都被纠正了!这个Valgrind其实是对的
positions
有64个值,当最后一个值弹出时(像堆栈一样工作),我正在访问
positions[64]
,这确实是未初始化的。最初没有引起问题,但如果没有被发现,可能会是灾难性的。。。再次感谢!!!。。。它应该给我一条
无效读取的消息,不过…;)你能详细介绍一下valgrind吗?valgrind通过在沙箱中运行来观察你的程序。明天你可能会想在这里读到:@angel:尝试在有问题的行中添加换行符,以便每个变量都位于自己的行中。C不关心换行符。然后重新编译。谢谢你的帮助!我完成了调试,所有的错误都被纠正了!这个Valgrind其实是对的
positions
有64个值,当最后一个值弹出时(像堆栈一样工作),我正在访问
positions[64]
,这确实是未初始化的。最初没有引起问题,但如果没有被发现,可能会是灾难性的。。。再次感谢!!!。。。它应该给我一条
无效读取的消息,不过…;)哦,谢谢。我只使用带有[]运算符的指针。它仍然会导致问题吗?@angel-我通常只使用任何类型的指针将空闲调用与malloc或calloc调用进行匹配。我用的是这样的东西as@angel-抱歉,上次尝试时不断出错。你免费用什么?你能给我举个例子吗?我从未使用free来创建任何使用[]创建的内容,
  char *string;
  string = malloc(10);
  string++;      //move memory pointer to location other than originally allocated  
  free(string);  //attempt to free will result in error