template class shared_ptr { T* p_; mutable const shared_ptr* next_; mutable const shared_ptr* prev_; public: shared_ptr() : p_(0), next_(0), prev_(0) { } explicit shared_ptr(T* p) : p_(p), next_(0), prev_(0) { } shared_ptr(const shared_ptr& p) : p_(p.p_), next_(&p), prev_(p.prev_) { if (p.prev_) { p.prev_->next_ = this; } p.prev_ = this; } ~shared_ptr() { if (prev_) { prev_->next_ = next_; } if (next_) { next_->prev_ = prev_; } if (!(next_ || prev_)) { delete p_; } } void swap(shared_ptr& other) { std::swap(p_, other.p_); std::swap(next_, other.next_); if (next_) { next_->prev_ = this; } if (other.next_) { other.next_->prev_ = &other; } std::swap(prev_, other.prev_); if (prev_) { prev_->next_ = this; } if (other.prev_) { other.prev_->next_ = &other; } } shared_ptr& operator=(const shared_ptr& other) { if (p_ == other.p_) { return *this; } else { shared_ptr temp(other); temp.swap(*this); return *this; } } T* get() const { return p_; } T* operator->() const { return p_; } T& operator*() const { return *p_; } };