2013-03-19 116 views
-3

我的程序正在完成,甚至在返回0之前打印最终的“DONE2”。主要。 我有malloc动态内存分配,但我没有免费的在我的程序。程序结束时没有免费的双免费或腐败

为什么/我怎么能得到这个没有自由的,为什么我的程序仍在运行,直到完成,我应该怎么找出错误/秒的来源是什么?

编辑:我只问怎么会可能得到错误没有免费的和程序是如何将达到执行结束。

*** glibc detected *** ./prog: double free or corruption (out): 0x09574040 *** 
======= Backtrace: ========= 
/lib/libc.so.6[0x9ca595] 
/lib/libc.so.6(cfree+0x59)[0x9ca9d9] 
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x2e6c581] 
./prog[0x804b2f9] 
./prog[0x804b33b] 
./prog[0x804b34f] 
./prog[0x804b4d5] 
./prog[0x804b4ec] 
./prog[0x804bb6f] 
./prog[0x8049d43] 
./prog[0x8049d59] 
./prog[0x8049d88] 
./prog[0x8049da2] 
./prog[0x8049de3] 
./prog[0x8049e6f] 
./prog[0x8049604] 
/lib/libc.so.6(__libc_start_main+0xdc)[0x976e9c] 
./prog(__gxx_personality_v0+0x79)[0x8049271] 
======= Memory map: ======== 
002d4000-002d5000 r-xp 002d4000 00:00 0   [vdso] 
0093e000-00958000 r-xp 00000000 fd:00 559505  /lib/ld-2.5.so 
00958000-00959000 r-xp 00019000 fd:00 559505  /lib/ld-2.5.so 
00959000-0095a000 rwxp 0001a000 fd:00 559505  /lib/ld-2.5.so 
00961000-00aa0000 r-xp 00000000 fd:00 559506  /lib/libc-2.5.so 
00aa0000-00aa2000 r-xp 0013f000 fd:00 559506  /lib/libc-2.5.so 
00aa2000-00aa3000 rwxp 00141000 fd:00 559506  /lib/libc-2.5.so 
00aa3000-00aa6000 rwxp 00aa3000 00:00 0 
00aa8000-00acd000 r-xp 00000000 fd:00 559513  /lib/libm-2.5.so 
00acd000-00ace000 r-xp 00024000 fd:00 559513  /lib/libm-2.5.so 
00ace000-00acf000 rwxp 00025000 fd:00 559513  /lib/libm-2.5.so 
02dab000-02db6000 r-xp 00000000 fd:00 559517  /lib/libgcc_s-4.1.2-20080825.so.1 
02db6000-02db7000 rwxp 0000a000 fd:00 559517  /lib/libgcc_s-4.1.2-20080825.so.1 
02db9000-02e99000 r-xp 00000000 fd:00 79091  /usr/lib/libstdc++.so.6.0.8 
02e99000-02e9d000 r-xp 000df000 fd:00 79091  /usr/lib/libstdc++.so.6.0.8 
02e9d000-02e9e000 rwxp 000e3000 fd:00 79091  /usr/lib/libstdc++.so.6.0.8 
02e9e000-02ea4000 rwxp 02e9e000 00:00 0 
08048000-0805c000 r-xp 00000000 fd:00 789714  /home/echelon/correngine/prog 
0805c000-0805d000 rw-p 00013000 fd:00 789714  /home/echelon/correngine/prog 
09553000-09594000 rw-p 09553000 00:00 0   [heap] 
b7fa9000-b7fab000 rw-p b7fa9000 00:00 0 
b7fb4000-b7fb5000 rw-p b7fb4000 00:00 0 
bfbe9000-bfbfe000 rw-p bffea000 00:00 0   [stack] 
DONE 
DONE2 
make: *** [run] Aborted 

编辑:谢谢,问题是我通过长时间拍摄造成“腐败”而不是双倍免费的缓冲区。

+4

发布您的信息? – Tushar 2013-03-19 02:33:41

回答

0

我使用malloc动态内存分配,但我没有自由的在我的计划

哇!停在这里!这是一个严重的问题 - 程序中的一个错误。找出为什么其他事情在你有这个明显的错误时无法正常工作并不重要。你需要通过添加,你必须malloc每次调用相应地调用free解决这个问题第一。只有一旦你做完了这个,你应该担心解决你的其他问题(如果它们还存在的话)!

为什么/我怎么能得到这个没有自由的

几乎可以肯定,这是报告问题无关的free使用(或不使用)。错误信息的重要部分实际上是损坏部分。

这是常见的,当你要覆盖过去,你问使用malloc的内存块来得到这个错误。例如,如果你的意思是分配的内存来保存的结构Foo块,但你只分配一个指针空间结构Foo,你会继续写超出实际分配的空间量,破坏信息在不属于你的记忆中。 glibc正在检测这种可能存在于内存中的数据的损坏情况,并进行合理分析。

这是我们不可能找出这正在发生,除非我们可以看到实际的代码。但是,当您搜索所有malloc拨打电话的代码时,为了使其与匹配free的相应呼叫匹配起来,这也是检查并确保您拨打malloc的每个呼叫都正确的好时机。

为什么我的程序仍在运行,直到完成

如果问题是我上面预测,你已经进入的Undefined Behavior境界。基本上,这意味着你已经完成了语言标准所说的你不应该做的事情(写出不属于你的内存)。既然你已经完成了,语言标准完全不能保证你的程序执行时会发生什么。它可能工作得很好。它可能每次崩溃。它可能有时只会崩溃。它可能损坏你的硬盘。它可能导致你的房子着火和demons to fly out of your nose。你永远不知道。这就是为什么你应该避免不惜代价调用Undefined Behavior。它不仅可怕,而且还会指向代码中的错误。