[PHP-dev 60] mbereg のメモリ管理について

Osamu Shigematsu php-dev@php.gr.jp
Thu, 20 Sep 2001 11:40:11 +0900


重松と申します。

こちらに書くのが適切なのかどうかわかりませんが、PHP4 の (mbereg の) メモリ管
理について質問があります。

PHP の拡張モジュールとして mbereg のライブラリを組み込んだ場合には、malloc()
などの動的なメモリ割り当て関数は、PHP か、あるいは、Apache の等価で失敗しえ
ない関数を使うので、常に null でない値しか返さない、と考えて良いのでしょう
か?

もともとは ruby の正規表現ライブラリを引っ張ってきているようでしたので、ruby
の ml の方でまずは尋ねたのですが、こちらでは、独自のメモリ管理 (gc) を行って
おり、「絶対に失敗しない」から malloc() や realloc() が null を返すことはな
いので、その処理は不要、ということでした。

しかし、ソースをよく見たつもりなのですが、

php_mbregex.c (line 200)
        pre->fastmap = (char*)malloc((1 << MBRE_BYTEWIDTH)*sizeof(char));

なんか、そのままですし、肝心の、mbregex.c についても、

#define xmalloc ruby_xmalloc
#define xcalloc ruby_xcalloc
#define xrealloc ruby_xrealloc
#define xfree ruby_xfree

void *xmalloc _((size_t));
void *xcalloc _((size_t,size_t));
void *xrealloc _((void*,size_t));
void xfree _((void*));
#endif

#define xmalloc malloc
#define xcalloc calloc
#define xrealloc realloc
#define xfree free

あたりに malloc を wrap するマクロがありますが、ruby の gc のコードはどこに
もないので、単純に malloc だとかを呼んでいるのではと推測しています。

だとすると、エラーチェックなし、メモリリークの可能性ありなコードだと思うので
すが、それでも何故か動いているのは UN*X だからなのでしょうか?

この辺りのからくりご存じの方がいらっしゃいましたら、ご教授下さい。

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/%7eshige/
mailto:shige@ravi.ne.jp