RGSS2を知る(25)

ピンポイントに調べた。

class Bitmap
  def initialize(*)
  end
end
b = Bitmap.new(200,100)
b.clear

このコードはBitmapのinitializeを無効にする。
通常、Cで書く拡張ライブラリでは、newしたときにCのallocate関数でオブジェクトメモリを確保し、Rubyのinitializeを呼ぶ。
Bitmapクラスの場合、ファイル名やサイズを渡して初期化するのはinitializeメソッドであり、それが呼ばれなければ内部的に画像データのメモリは取得されないはずである。
この状態でなんらかのメソッドを呼び出すと、存在しない画像データに対して処理を行い、コケる、というのはよくあるバグだ。
結果はこう。

どうやらallocate時点ではdisposeされている。
initializeを呼ぶとdisposeが解除される、ということらしい。
ちなみにDXRubyのImgaeクラスでこれをやると見事にコケるので真似しないよーに。
修正せねば。