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.
$Id: dancer-diary.el,v 1.90 2006/01/31 11:16:16 dancer Exp $