前回こちらの掲示板でも話題になったHSP3.5におけるメモリリークですが、
修正作業のほうは順調でしょうか…この問題ですが、
調べてみますとリークが発生するケースはかなり多いことに気付きました。
HSPは変数にデータを代入する際に変数の型変換を行っていることが
より状況を悪化させている気がします。
この問題を認識されていないHSP3.5の利用者の皆様はご注意ください。
前回こちらで報告されたメモリリークの例は次のようなものでしたが
//例1:split命令使用でのメモリリーク例 repeat repeat 60 sdim t,8 //ここでリーク? v="a,b,c,d,e,f,g,h,i,j,k" split v,",",t loop if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" await 10 loop
そのほかにも以下のような利用方法でメモリリークが容易に発生します。
タスクマネージャ等でメモリ消費が増えていく様子を確認してみてください。
//例2:最もシンプルなメモリリーク例 repeat repeat 1000 v="123","example" v=int(v) //ここでリーク? loop await 10 if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" loop
次に、モジュール利用時にもリークが発生するパターンを確認しています。
単にローカル変数を文字列変数として利用するだけでもメモリリークが発生します。
//例3:ローカル変数利用でのメモリリーク例 #module #deffunc func local t t="","" return #global repeat repeat 1100 func loop if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" await 10 loop
それに加えて、モジュール変数の利用でもメモリリークが発生します。
//例4:モジュール変数使用でのメモリリーク例 #module a v #modinit v(0)="d1" v(1)="d2" return #deffunc func newmod pv,a:return #deffunc work foreach pv delmod pv(cnt) //ここでリーク? loop return #global repeat repeat 1000:func:loop work await 10 if cnt\20=0:if cnt/20\2:title "":else:title "■1秒あたり約2MBの速度でメモリリーク中!!■" loop
HSPでは例2で挙げたような一時的に利用するような変数で無意識に型を変えながら
利用されるユーザーは結構多いような気がします。
型宣言は必ずやるという人でも、例3のように、ローカル変数までは変数の初期化を
行わずに使われてしまう方はいるのではないでしょうか。
一般的な作品のほかにも、弾幕シューティングやRPG、キャラクターがわらわらと
登場するようなタイプのゲームでは気付かないうちに深刻なメモリリークに陥って
しまっているケースが懸念されると思います。
この不具合だけでも修正していただき、HSPのメジャーバージョンアップ
(HSP3.51のような形で)をご検討いただけないでしょうか。
すぐにできない場合でも、HSPのトップページやダウンロードページ
(Vector及び窓の杜含め)などでこのような危険な不具合が存在していることの
注意喚起と修正プログラムの入手場所への誘導は必須に感じられます。
(サンプルスクリプトやモジュールなどで a="test","123" などと代入を行っている
プログラムは数多く存在していますから、こうしたスクリプトをメインループ中に
気軽に組み込む行為はHSP3.5においては非常に危険と思われます。)
HSP3.5は既に半年も運用しているバージョンですから、
なるべくならメジャーアップデート後も、HSP3.5で作成されたプログラムは
メモリリークのリスクをはらんでいることから利用者はアップデートを推奨する旨を
やんわりとでもいいですからニュースリリースに記載していただければ
被害は最小限に抑えられるかと思います。
どうぞ宜しくお願いいたします。