linux下兩次fclose執行時出錯及解決方法

2021-06-21 01:20:28 字數 2158 閱讀 8079

今天敲**不小心兩次fclose了同乙個檔案指標。結果執行時爆了一堆錯誤

*** glibc detected *** logconvert: double free or corruption (out): 0x000000001685d750 ***

*****== backtrace: *****====

/lib64/libc.so.6[0x30c66722ef]

/lib64/libc.so.6(cfree+0x4b)[0x30c667273b]

/lib64/libc.so.6(fclose+0x14b)[0x30c6660d5b]

logconvert[0x403278]

/lib64/libc.so.6(__libc_start_main+0xf4)[0x30c661d994]

logconvert(__gxx_personality_v0+0x121)[0x4026a9]

*****== memory map: *****===

00400000-00421000 r-xp 00000000 08:03 425403                           

00621000-00622000 rw-p 00021000 08:03 425403                            

00622000-00a2a000 rw-p 00622000 00:00 0

16830000-16872000 rw-p 16830000 00:00 0                                 

302cc00000-302cc45000 r-xp 00000000 08:03 457417                        

302cc45000-302ce44000 ---p 00045000 08:03 457417                        

302ce44000-302ce4a000 rw-p 00044000 08:03 457417                        

3033400000-3033409000 r-xp 00000000 08:03 457416                        

3033409000-3033608000 ---p 00009000 08:03 457416                       

3033608000-3033609000 r--p 00008000 08:03 457416                        

3033609000-303360a000 rw-p 00009000 08:03 457416 

這堆錯誤當然是看不懂了,目錄下生成了core.20472這個core檔案,可以方便的幫我們找出錯誤所在行。

當前目錄下執行gdb -c core.20472 logconvert    ps:logconvert是編譯生成的可執行程式

進入gdb後,使用命令bt得到以下結果

(gdb) bt

#0  0x00000030c6630265 in raise () from /lib64/libc.so.6

#1  0x00000030c6631d10 in abort () from /lib64/libc.so.6

#2  0x00000030c666a84b in __libc_message () from /lib64/libc.so.6

#3  0x00000030c66722ef in _int_free () from /lib64/libc.so.6

#4  0x00000030c667273b in free () from /lib64/libc.so.6

#5  0x00000030c6660d5b in fclose@@glibc_2.2.5 () from /lib64/libc.so.6

#6  0x0000000000403278 in main (argc=, argv=)

at logconvert.cpp:676

產生異常的地方位於logconvert.cpp 676行。

總結:在linux下fclose兩次是未定義行為,會執行出錯。而在windows+vs2010環境下則不會報錯,還沒來得及深究。

良好程式設計習慣:fclose檔案指標後,再將指標置為null,以後判斷是省的重複close,以免報錯。

Linux下C語言記憶體兩次釋放問題

在linux中,c語言程式設計的永遠讓人最頭痛的問題還是記憶體管理了。特別在記憶體釋放上面,其中有乙個標準就是記憶體一定要釋放,否則就會造成記憶體洩露問題。但是釋放的時候也要隨時注意,因為釋放一次是ok的,但是同一塊記憶體釋放2次的話就是錯誤的了。道理大家很多人都懂,但是實際用起來的時候就會出很多頭...

關於兩次fork

兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 return 或exit 如下圖1所示 在一定時間內,當系統發現孤兒程序時,ini...

關於兩次fork

兩次fork 的作用 首先,要了解什麼叫殭屍程序,什麼叫孤兒程序,以及伺服器程序執行所需要的一些條件。兩次fork 就是為了解決這些相關的問題而出現的一種程式設計方法。孤兒程序 孤兒程序是指父程序在子程序結束之前死亡 return 或exit 如下圖1所示 在一定時間內,當系統發現孤兒程序時,ini...