トップ 最新

kumaryu日記

2005-01-28 風邪

_ 風邪かな

腹の調子が悪いし頭痛い気がするし。

早く寝ればいいのに。

_ ruby/wx

二重解放の問題

wxRubyを見たら何もしてない雰囲気。

何もしてないというのは、本当に何も、つまり解放すら行なっていない。

あーあ。

wx.NETを見ると、wxEvtHandlerでwxEVT_OBJECTDELETEDとかいうイベントを受けとっている。

こいつはwx-c内で定義したクラスのデストラクタから送出される独自のイベントらしい。

で、これを受けとったら解放済みのマークをしてC#側のクラスのデストラクタ*1では解放しないようにする。

そういうことなので、これを実装。同じくwxEVT_OBJECTDELETEDを処理するようにして解放済みマークを付けてファイナライザでは解放済みマークをチェックしてから解放する。

これでおおむね成功。

ただwxAppだけ二重解放が残った。wxAppの派生クラスではデストラクタでイベント送出してくれないらしい。wx.NETを見ても特にwxAppの対処が入ってるようには見えないよなぁ。どうやって回避してるのかさっぱりわからん。

でも、まあ、アプリケーションの終了以外でwxAppを削除することは無いし、そもそもアプリケーション側から明示的に削除するような物でも無いようなのでwxAppはファイナライザでの解放をしないようにした。

これでちゃんと動きそうだ。

wxEvtHandlerを継承しないクラスでは依然問題があるはずだが、それらにはデストラクタのコールバック設定が出来るから、こちらは個別に対応すればいいはず。

パーサ

うう、やっぱりC++をパースした方がいいかも。

型情報は多い方がいいや。

wxString*がIntPtrに置き換えられているのは困る。 wxString*とRuby文字列間の変換は自動でやりたいので、wxString*は型として残ってて欲しいんだよな。

パーサがコメントを無視できるようになれば、C++をパースするのも実用になるかも。 ちょっとやってみるか。

*1  C#ではなんて言うんだっけ?デストラクタでいいのか?