東方記憶漏

東方弾幕風のことを書くのは久しぶりですので少し紹介から。
http://www.geocities.co.jp/SiliconValley-Oakland/9951/
mkmさんが作られている弾幕シミュレーターというよりは丸ごと実行環境。私の直接の知り合いの中では最も成功したソフトと思われます。*1
で、まあ、上記ページのトップからリファレンスからリンクが張られているのを見ればわかりますように、私は東方シリーズをやったことは一度もない身でありながら、というかグラディウスの一面もクリアできるかどうか際どいぐらいシューティング下手でありながら、インタプリタが逐次実行しているという話を聞いては、中間コード形式のスクリプトエンジンをmkmさんが望んでもいないのにでっち上げて押しつけました。
これがいわゆる#ScriptVersion[2]です。
#ScriptVersion[2]以降、なかなかスクリプトエンジン本体が進歩しない、バグが直らないのは全て私のせいです。mkmさんがVisual C++を使っておられるので、リンクできるようにC++で書いたのですが、私のC系構文嫌いは近年ますます強くなる傾向があり、最近ではあれだけ誉め称えていたDすら放置モードの始末はご存じのとおり。id:w_oさんじゃないですけど、世の中の多数派であるところのbegin〜endだけでPascal系を敬遠する人達とは逆で、私は中括弧というだけで理不尽にC系を嫌ってます。自覚ありです。どうしようもないです。
そんな私としては今更Visual C++を買うのは敗北感がひしひしですので、C++BuilderXを使っています。また、バラしてしまいますがmkmさんはVC++6 Standardしか持っておられませんので、VC++Toolkit公開以前は最適化すらできなかったのです*2
というわけで結構#ifdefは入ってるのですが、特に今でもデバッグのため標準準拠度の低いVC++6でもコンパイルを通さないといけないため、スクリプトエンジンのヘッダーにはfriendの挙動の違いを吸収する、

#ifndef _MSC_VER
private:
#endif

という衝撃の一文が…。
まあそんなのはどうでもいいのです。
先週のmkmさんはメモリリーク撃退週間だったみたいで、その内の一件として、スクリプトエンジン本体のメモリリークが私のところに来ました。
昨日今日と二日かけてようやく見つけて直してみれば、1ステージごとに50MBものリークがあったという衝撃のバグ。
はっはっはー。
_CrtMem〜、便利ですね。VC++にはいいものがありますね。そういえばC++Builder(非X)のPro版以上にはCodeGuardなんてついてましたね。
バグ自体は、Toolkit公開以前は最適化のできないStandardで速度を出すために、lightweight_vectorというものをでっちあげていたのですが、要素数が0の時コピーコンストラクタでnew T[0]してしまうのでこれが解放されないというものでした。
ごほん。
何が言いたいかといいますと。
東方弾幕風がステージを重ねるごとに重くなっていた現象は、私のC++に対する不理解が全ての元凶であり、mkmさんはちっとも悪くなくむしろ被害者であることを、ここに明言しておく次第であります。
http://www.geocities.co.jp/SiliconValley-Oakland/9951/diary/diary.html
で書かれているような、親切な人間では、私は、ちっとも、これっぽっちも、ありません。
そして、別にこんなことがあったからといって私がC++をちゃんと勉強せねばと思い直したなんてことは一切無く*3、「だからC++やめましょう」とmkmさんに一言言って、それで何が変わったわけでもないことも追記しておきます。

*1:恐らく次ぐらいに成功したのがCyberXのmsn okiraku extension(←また余計なことを書く)。

*2:バラすも何も人格者のmkmさんは自分の掲示板に正直に書いておられますが。

*3:ってそんな大ごとですらなく単なるケアレスミスの類ですが。でもreallocではサイズ0は解放なのに、new T[0]もNULL返してくれれば…と少し思わないでもなかったり。