2006年1月8日 (日曜日)

22:45:22 # Life mallocしたものはdeleteしちゃいけないよ. バグレポートで,valgrindでメモリリークが検出された,という報告があった. 342156. しかし,それをよくみると,mallocしたメモリ領域をdelete[]で開放していたことにより検出されているようだった. ところで,これでもちゃんと動くのだが,現状でこれはどうやって実装されているのだろうか. 確認してみる. void* のデストラクタというのがきちんと定義されており(libstdc++ の _ZdlPv), その中身を見ると void* をfreeするようなコードになっていた. Cで書くとif(a) { free(a);}か. とりあえずはこのままで期待したように動作してくれるので, コンパイル時にg++が警告は出すけど特に 動作には問題が無いことがわかった. 今後もこれ以外のまともなデフォルトの動作というのはありえるのだろうか. なんとなく今後もうごきつづけるような気がしている. この関連の話題は頻繁にでてくるものであるらしく, new/deleteとmalloc/freeをまぜることは罪であるだとか バケツでウラン症候群だとか,えらいいわれようですね. たしかにバグの温床にはなりそうなので細かいコンパイラの挙動などまで正確に追跡する暇がない限りはmallocとdeleteをまぜて使わないほうがよさそうです.

(gdb) disassemble _ZdlPv
Dump of assembler code for function _ZdlPv:
0x00002aaaaac7bbc0 <_ZdlPv+0>:  test   %rdi,%rdi
0x00002aaaaac7bbc3 <_ZdlPv+3>:  je     0x2aaaaac7bbd0 <_ZdlPv+16>
0x00002aaaaac7bbc5 <_ZdlPv+5>:  jmpq   0x2aaaaac11138 <free@plt>
0x00002aaaaac7bbca <_ZdlPv+10>: data16
0x00002aaaaac7bbcb <_ZdlPv+11>: data16
0x00002aaaaac7bbcc <_ZdlPv+12>: nop
	

ソースはどうやらこれっぽいですね: gcc-4.0/libstdc++-v3/libsupc++/del_op.cc.

Junichi Uekawa

$Id: dancer-diary.el,v 1.90 2006/01/31 11:16:16 dancer Exp $