はじめまして。増田です。
初歩的なことで恐縮なのですが、C++の拡張ライブラリの書き方で質問です。

updateというコールバック用のメソッドを持つ、以下のような既存のC++ライブラリのクラスがあり、

class ofSimpleApp {
       public:
               virtual void update(){}
};

このコールバックをRubyで書けるようにすべく、対応するRubyオブジェクトを作ってサブクラスで定義したいと思っております。

# Ruby側からは以下のような感じで使えるようにしたい
AppRunner.runApp(Class.new(SimpleApp) do
 def update
   # 描画ループ
 end
end.new)

私なりにやってみたものが、以下になります。
あまり作法が分からず、RubyでラップするC++クラスに、自身のRubyラッパの参照を持たせてしまいました。
updateが呼び出されると、対応するRubyラッパのメソッドを呼び出します。

static int id_update = rb_intern("update");

class mySimpleApp : public ofSimpleApp {
       public:
               void update();
               VALUE ruby_obj;
};

void mySimpleApp::update() {
       rb_funcall(ruby_obj, id_update, 0);
}

肝心の拡張ライブラリのメインの部分ですが、以下のようにしています。

static VALUE cMySimpleApp;

//きっとマーク関数が必要だろうと推測
void mark_sa(mySimpleApp *app)
{
       rb_gc_mark(app->ruby_obj);
}

VALUE alloc_sa(VALUE klass)
{
       return Data_Wrap_Struct(klass, mark_sa, 0, new mySimpleApp);
}

VALUE initialize_sa(VALUE self)
{
       mySimpleApp *app;
       Data_Get_Struct(self, mySimpleApp, app);
       app->ruby_obj = self;
       return self;
}

#ifdef __cplusplus
extern "C" {
#endif
void Init_rbof(void)
{
       cMySimpleApp = rb_define_class("SimpleApp", rb_cObject);
       rb_define_alloc_func(cMySimpleApp, alloc_sa);
       rb_define_method(cMySimpleApp, "initialize", (RubyType
*)initialize_sa, 0);
}
#ifdef __cplusplus
}
#endif

これで動いてはいるものの、GC的に何かやってはならないことを犯しているのではと不安です。「C++のフックメソッドに対応するRubyのフックメソッド」は通常どのように実装されるのでしょうか・・?

C++もRubyの拡張ライブラリも初めてでして、かなりおかしなことをしているかもしれませんが、もし何か参考になるソースなどありましたら、ご教授いただけると幸いです。よろしくお願い致します。