2013-03-19 121 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。它不僅可怕,而且還會指向代碼中的錯誤。