Weak handle にも Dispose の愛の手を

http://groups.google.com/group/v8-users/browse_thread/thread/d0c8bd822ce21f9e
http://d.hatena.ne.jp/tossy-2/20090123/1232653840


最近の v8-users のログを見たらちょうど話題にあがっていたので、ちょっとエントリ修正。
上記エントリでデストラクタの呼び出しを GC 任せにする手法が導入されていますが、weak handle にするために作った Persistent のハンドルが Dispose されていませんでした。
たしかに、ヒープ内のハンドルをおっかけていると、参照のない weak handle は GC サイクルで NEAR_DEATH (=WeakReferenceCallback が呼ばれた)状態になりますが、DESTROYED (=ハンドルが解放され、フリーになった)状態にはなりません。
よく考えれば、ハンドル自体への参照がある「かもしれない」状態で、勝手に自分を delete したりするのは危険ですから(dangling pointer になってしまうので)、ハンドル側ではそこらへんのケアをしないのはまったく当然です。


ということで、正しくはコールバックを次のように書く必要があるそうです。

static void hoge_Destructor(v8::Persistent<v8::Value> handle, void* parameter)
{
  delete static_cast<hoge*>(parameter); // ...など

  handle.Dispose(); // ここでハンドルを解放する
}