爺感:メモリ管理はやっぱり面倒くさい
大昔、
で、
char *foo() { char buffer[BUFF_SIZE]; // ... return buffer; }
は話題にしたことがある。
return buffer; はないけど、return strdup(buffer); はよくやっていた。foo() は文字列リテラルみたいなもんで、ヒープ領域は取りっぱなし。foo() が何度も呼ばれるとまずいが、一度か少数なら問題ない。プロセスが終わるとき回収されるからいいや、と思っていた。
最近の(つうか、昔もあったろうが)用途だと、プロセスが終わらないでオブジェクトを何度も、あるいはたくさん使うので、短寿命のプロセスを仮定するわけにいかないことがある。ほったらかしstrdup()みたいなことをやるとマズイ。
strdup()が間違いやすいのは、戻り値なので始末を忘れる。strcpy()だと呼び側でバッファを準備するので、バッファを準備した人が始末もする、で分かりやすい。
所有権だとかmoveだとかいうのは、メモリの確保と廃棄に関しての責務のあり方をコンパイラにも理解させて追いかけさせる、ってことだと思う。
今の状況では、moveも新しいスマートポインタも使えないので、人の注意力に頼っている。strdup()みたいに、確保して戻り値で返してしまい、後始末を他人に委ねるスタイルは避けたいのだが、実際にはある。このての関数は、mallocやnewと同じと言えるので、せめてネーミングコンベンションで識別可能にしておこうかな。
'new'をgrepしたとき引っかかるように、newHoge() とか。strdup的な hogeDup() とか。
[追記]allocXxx にした。[/追記]