Skip to content

Instantly share code, notes, and snippets.

@melpon
Created July 17, 2012 08:03
Show Gist options
  • Save melpon/3127899 to your computer and use it in GitHub Desktop.
Save melpon/3127899 to your computer and use it in GitHub Desktop.
oreore simple shared_ptr
#ifndef UTIL_SHARED_PTR_H_INCLUDED
#define UTIL_SHARED_PTR_H_INCLUDED
// for swap in C++03
#include <algorithm>
// for swap in C++11
#include <utility>
#include <new>
// simple shared ownership pointer
template<class T>
class shared_ptr {
T* p_;
int* pn_;
public:
shared_ptr() : p_(0), pn_(0) { }
~shared_ptr() {
if (pn_ && --*pn_ == 0) {
delete p_;
delete pn_;
}
}
explicit shared_ptr(T* p) : p_(p) {
if (p) {
try {
pn_ = new int(1);
} catch (...) {
delete p;
throw;
}
} else {
pn_ = 0;
}
}
shared_ptr(const shared_ptr& p)
: p_(p.p_), pn_(p.pn_) {
if (pn_) ++*pn_;
}
shared_ptr& operator=(const shared_ptr& p) {
shared_ptr<T> tmp(p);
tmp.swap(*this);
return *this;
}
void reset(T* p = 0) {
shared_ptr<T> tmp(p);
tmp.swap(*this);
}
void swap(shared_ptr& p) {
std::swap(p_, p.p_);
std::swap(pn_, p.pn_);
}
T* get() const { return p_; }
T* operator->() const { return p_; }
T& operator*() const { return *p_; }
operator bool() const { return p_ != 0; }
// for debug
int count() const { return pn_ ? *pn_ : 0; }
};
#endif // UTIL_SHARED_PTR_H_INCLUDED
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment