動的に確保した領域を解放するタイミングについて


エクステに String Tokenizer のユニコード対応版を機能実装しようとしてここ一週間ほど詰んでる。Token のロジックはほぼできたけど動的に確保された領域を解放する、最適なタイミングで自動的に行いたいのだけどこれが実装できない。


解放する場合、アプリケーションが終了時とフレームが終了時、それとエクステがイベント中で明示的に破棄されたとき、この三種類のイベントトリガを検出できないといけない。標準関数のなかにそれらを見つけたのだけどアプリとのグローバルを解放する手順しかサンプルが書かれてない。

グローバルが二種類ある

エクステンションは MMF アプリケーションと共有アクセス可能なグローバルなメモリ空間を持つことができる。

ヘルプファイルによると「 mv 」プレフィックスがこれを指すようで、アプリとエクステで情報を共有して利用可能らしい。要するに MMF/CF25 が持ってるグローバル変数をエクステ経由で値弄ったり、エクステ内部に配列を持たせてこれをグローバル的に MMF/CF25 と共有して扱うとかできるんだと思う。

今回はこれとは別、エクステ内部だけで運用する「グローバル」な変数を扱いたいのだけど、これ自体はラク。グローバルは main.cpp に直接書くこともできるし、runtime.cpp から RUNDATA 構造体にメンバを追加してこれを使う方法もある。この構造体は登録関数を呼び出すとき毎回読み込まれるので、ここに値を持たせればグローバル的に扱うことができる。

ただし動的に領域を確保する場合、アプリを閉じるときやフレームを終了する際など動的に確保された領域を明示的に解放するタイミングを考慮する必要がある。

アプリケーション終了のイベントトリガを検出したら実行される関数が標準で用意されているので、たぶんそのタイミングで解放するのが一番良いと思うのだけど、しかし案外これがうまくいかない。あるいは IDE でデバッグ時はエラーを吐かないが、実際にエクステとして動作させるとアプリが正常に終了させることができなくなるなど。

SDK は読めるようになると面白い…けど

エクステの仕様と同時に MMF や CF25 の動作仕様とか書かれているので、SDK は読めるようになると面白い。

ただ「読めるようになると」の言葉の意味は、単に英語が読めるとかその意味とは違う。MMF の独自仕様である MMF 的な専門用語について前もって知ってないと意味がワカラネー単語が使われてる。だから MMF について知っていてこのソフトの中でだけ通用する専門用語も含めて「読めるように」ならないと読んでも意味がワカラネーのだ。

たとえば「 action loops 」とかコメント欄で単に書かれても MMF について知らない人では意味がわからないと思う。そして action loop について調べても、それについてヘルプにちゃんと書いてあるかというとそうでもない。

SDK は CT の誰が書いた文章なのかよくわからないけど結構な量の文章で、ドキュメントが無い無いと言われる MMF だけど、SDK 読むと意外と色々内部仕様について書かれてはいる。

できればロジックだけに集中したいけどなかなかそうもいかないのが残念に感じる。どうしてもエクステの仕様的な部分を理解するために時間を割かれてしまう。PC 用は C か C++ で開発するためメモリの管理も厳密だからそのあたりもエクステの開発は敷居が高くなってしまってる。

それにしてもなんで開放のタイミング作るためだけに何日も頭悩まさないといけないのだろうか…。自分用だし、もうめんどくさいから普通に配列確保でいいかという考えに傾きつつある。malloc 使わなければ問題無いし、用途が分かってるならデータ構造も固定化できるから管理的にも効率的だ。

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です