まつもと ゆきひろです

In message "[ruby-list:20475] Wrapping Regexp in C++/Windows"
    on 00/02/04, OZAWA Sakuro <crouton / duelists.org> writes:

|ruby-listよりはruby-extのような気もするのですが、ひとまずlistのほうへ出
|します。
|extって拡張ライブラリを作るためのMLだけど、rubyを埋め込むほうも可でしょ
|うか?

やったことないですけど、不可能ではないと思います。

|Windows98環境でC++の正規表現クラスRegexpが欲しくなったので、rubymw.dllを
|使って作ってるのですが、以下にあるメンバ関数matchを数千回呼び出すうちに、
|アクセス違反が生じます。

うーん、regex.cだけ使ったらどうかという気もしますが :-)

|ソースを追ってみたのですが、
|
|gc.cのrb_gc_mark()にてobjが不正
|reex.cのinit_regs()にてregsが不正
|
|など止まるところがまちまちなので困っています。

おそらくですが、コンストラクタの中で

|            rb_global_variable(&regexp_);

が原因ではないかと。rb_global_variable()で指定されたアドレス
はRegexpオブジェクトがdeleteされた後は不正なアドレスになるん
ではないかと。

とはいえ、ちょっと考えた限りでは他にGCから保護する方法が無い
んで、rb_global_variable()で登録したアドレスを削除するAPIが
必要な気がしますね。
                                まつもと ゆきひろ /:|)