apacheモジュールのメンテとかをしているんだが、メモリ管理系のapahceAPIはかなり楽だ。
本来なら、変数のサイズを常に気にしてcallocしたりfreeしたりする必要があるんだが、apacheAPIを使ってリソースpoolに管理を任せたら、その辺を全く気にしなくて良い。
sprintfするのも一苦労だけど、ここでもメモリ系を考えなくて良いAPIのapr_psprintfなどがあって、sprintfの第一引数は本来メモリを割り当てておく必要があるが、その必要も無い。
例えばこんなの。↓
if (x != NULL)
buf_len += strlen(x);
else
buf_len += NULL_LENGTH;
if (y != NULL)
buf_len += strlen(y);
else
buf_len += NULL_LENGTH;
buf = calloc(buf_len + 1, sizeof(char));
if (buf == NULL)
return "allocate error";
sprintf(buf, "x=%s y=%s", x, y)
free(buf);
この例だとbufには元々char方のxとかyだけを使っているが、ここにアドレスとかintを使うと、桁数計算とかでcharとしてのサイズがどれだけになるかとかが非常に面倒。
しかし、APIだと上のより面倒になりそうな実装がこんな風にかけちゃう。↓
buf = (char *)apr_psprintf(apr_pool_t *p,"x=%s y=%s z=%d adr=%x", x, y, z, adr);
こんな風に、整形した文字列に必要なサイズを自動で判断しリソースプールで確保してくれる。
こんなに楽だと、C書いてることを忘れそうだ・・・