free(): invalid next size (fast) の原因と対処法

調子にのってC言語でmalloc & freeするコードを書いてみちゃいました。
\(mallocデビュー)/

そしたら非情にもこんなエラーが出やがりました。
*** glibc detected *** minigit: free(): invalid next size (fast): 0x0000000002570030 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x760e6)[0x7fb2be1e80e6]
/lib64/libc.so.6(+0x78c13)[0x7fb2be1eac13]
minigit[0x4026cf]
minigit[0x402a70]
minigit[0x402c82]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x7fb2be190cdd]
minigit[0x400ff9]
全然意味がわからにゃい・・・
free()まわりでエンバグしたのかと思ってコードをいじってるとさらにこんなエラーが。
*** glibc detected *** minigit: munmap_chunk(): invalid pointer: 0x0000000001b01050 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x760e6)[0x7f134cff20e6]
/lib64/libc.so.6(fclose+0x14d)[0x7f134cfe274d]
minigit[0x4026bc]
minigit[0x402a0e]
minigit[0x402c20]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x7f134cf9acdd]
minigit[0x400fa9]
======= Memory map: ========
00400000-00404000 r-xp 00000000 fd:00 27790215                           /home/vagrant/minigit/minigit
00603000-00604000 rw-p 00003000 fd:00 27790215                           /home/vagrant/minigit/minigit
01b01000-01b22000 rw-p 00000000 00:00 0          

原因と対処法

どうやらmallocするときのサイズの計算を間違っていたようで、小さく割り当てすぎたのが原因のようでした。
outbuf = (char *)malloc(bufsiz);  
bufsizのサイズが小さすぎたので、ちょっと大きめに割り当てたら解決しました。

参考

こちらの記事にmallocとfreeの仕組みについての詳しい解説があります。
ありますが、今の私には理解できるはずもなく黙ってそっとページを閉じました><

malloc(3)のメモリ管理構造 | VA Linux Systems Japan株式会社

まとめ

C言語むずい・・・
カテゴリ:

人気記事