Boehm GCをC++のスマートポインタっぽく使う話
C++のプログラムを書いててGCを使いたくなるようなケースにぶつかったことは、ここ数年ないんですが、Goの絡みで、そういえばBoehm GCをC++のスマートポインタっぽく使えたら便利なのかな、とか思った。書くとしたら、こんな感じだろうか。
換言するならば、既存のクラスを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追記: タイトルがスタートポインタになってたので修正