Data_Wrap_Structは何をしているのか Ruby拡張ライブラリプログラミングガイドを読むと、 Data_Wrap_StructはRData型のRubyオブジェクトを作るらしい。VALUE型は単なるそのポインター。 1つのRDataを複数のVALUE型で参照する。どこからもマークされないとこのRData型オブジェクトはGCによって解放される。 つまりC++のオブジェクト(例えばObject3D)とRubyのオブジェクト(RData)は1対1で対応していなければならない。 そうするとRubyのGCによって解放されたタイミングで正しくObject3Dのデストラクタが呼ばれる。 この1:1の対応をどうやって実装するか? 30のM3Gのクラス全てにvoid*を持たせてRDataを指すのが一番簡単だ。 RData型もしくはVALUE型にしないのはruby.hをincludeしたくないから。