興味本位というか練習のつもりで shared_ptr
を自分で書いてみる.
まずは boost::shared_ptr
のドキュメントにあるインタフェースを元にして
最低限のものを単純に書いてみた.(ということで例外安全とかスレッドセー
フとか難しそうなことはひとまず無視)
template <typename T> class shared_ptr { T* ptr_; long* count_; public: typedef T element_type; shared_ptr() :ptr_(0), count_(0) {} ~shared_ptr() { decrement(); } template <typename Y> explicit shared_ptr(Y* p) :ptr_(p), count_(new long(1)) { } shared_ptr(const shared_ptr& r) :ptr_(r.ptr_), count_(r.count_) { increment(); } shared_ptr& operator = (const shared_ptr& r) { decrement(); count_ = r.count_; ptr_ = r.ptr_; increment(); return *this; } T& operator * () const { return *ptr_;} T* operator -> () const { return ptr_; } long use_count() const { return count_ ? *count_ : 0; } T* get() const { return ptr_; } void swap(shared_ptr& r) { std::swap(ptr_, r.ptr_); std::swap(count_, r.count_); } void reset() { shared_ptr().swap(*this); } private: void decrement() { if (count_) { if (--(*count_) == 0) { delete count_; delete ptr_; } } } void increment() { if (count_) { ++(*count_); } } };
0 件のコメント:
コメントを投稿