Boehm GCをC++のスマートポインタっぽく使う話

C++のプログラムを書いててGCを使いたくなるようなケースにぶつかったことは、ここ数年ないんですが、Goの絡みで、そういえばBoehm GCC++のスマートポインタっぽく使えたら便利なのかな、とか思った。書くとしたら、こんな感じだろうか。

換言するならば、既存のクラスをBoehm GCで管理できる。絶対既出のネタ。

デリファレンスは余計に発生するけど、そもそもGCが必要になるようなデータ構造は少ない(だろう)し、小粒度のデータは自前でメモリ管理すりゃいい(し、難しくもない)ので、この程度で十分かなーと。

追記:あーでも C++0xクロージャと組み合わせる場合を考えると、デリファレンス回数は減らしたいのかなー。

#include <gc_cpp.h>
#include <string>

template <typename T> class gc_ptr {
  struct gc_ptr_ref : public gc_cleanup {
    T* t_;
    gc_ptr_ref(T* t) : t_(t) {}
    virtual ~gc_ptr_ref() { delete t_; t_ = NULL; }
  };
  gc_ptr_ref* m_;
public:
  gc_ptr() : m_(NULL) {}
  explicit gc_ptr(T* t) : m_(NULL) { m_ = new gc_ptr_ref(t); }
  bool is_set() const { return m_ != NULL; }
  T& operator*() { return *m_->t_; }
  const T& operator*() const { return *m_->t_; }
  T* operator->() { return m_->t_; }
  const T* operator->() const { return m_->t_; }
};

int main(void)
{
  GC_INIT();
  
  gc_ptr<std::string> s(new std::string("hello world"));
  while (1) {
    s = gc_ptr<std::string>(new std::string(*s));
  }
  return 0;
}

11/18追記: タイトルがスートポインタになってたので修正