linux下两次fclose运行时出错及解决方法

今天敲代码不小心两次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=<value optimized out>, argv=<value optimized out>)
    at logconvert.cpp:676

产生异常的地方位于logconvert.cpp 676行。

 

总结:在linux下fclose两次是未定义行为,会运行出错。而在windows+VS2010环境下则不会报错,还没来得及深究。

良好编程习惯:fclose文件指针后,再将指针置为NULL,以后判断是省的重复close,以免报错。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值