#include <iostream>
#include <memory>
using namespace std;
namespace smart_pointer
{
template <typename T>
struct defaultDeleter {
void operator()(const T *ptr) {
if(ptr) {
delete ptr;
ptr = nullptr;
}
}
};
template <typename T, typename Deleter=defaultDeleter<T> >
class shared_ptr {
public:
shared_ptr();
shared_ptr(T *ptr);
shared_ptr(const shared_ptr &sp);
shared_ptr(shared_ptr &&sp);
~shared_ptr();
T* operator ->() const;
T& operator *() const;
operator bool() const;
shared_ptr &operator =(const shared_ptr &sp);
shared_ptr &operator =(shared_ptr &&sp);
T* get() const;
void reset(T *ptr);
void swap(shared_ptr &sp);
int count();
private:
atomic<int> *use_count;
T *ptr;
};
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::shared_ptr()
{}
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::shared_ptr(T *_ptr)
: ptr(_ptr), use_count(new atomic<int>(1))
{}
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::shared_ptr(const shared_ptr &sp)
: ptr(sp.ptr), use_count(sp.use_count)
{
++*use_count;
}
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::shared_ptr(shared_ptr &&sp)
{
std::swap(ptr, sp.ptr);
std::swap(use_count, sp.use_count);
}
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::~shared_ptr()
{
if(ptr) {
--*use_count;
if(*use_count <= 0) {
Deleter()(ptr);
delete use_count;
cout << "shared_ptr dctor" << endl;
}
}
}
template <typename T, typename Deleter>
T *shared_ptr<T, Deleter>::operator-> () const
{
return ptr;
}
template <typename T, typename Deleter>
T& shared_ptr<T, Deleter>::operator* () const
{
return *ptr;
}
template <typename T, typename Deleter>
shared_ptr<T, Deleter>::operator bool() const
{
return ptr!=nullptr;
}
template <typename T, typename Deleter>
shared_ptr<T, Deleter> &shared_ptr<T, Deleter>::operator= (const shared_ptr<T, Deleter> &sp)
{
#if 1
shared_ptr<T, Deleter> tmp(sp);
swap(tmp);
return *this;
#else
if(sp.ptr == ptr) return *this;
ptr = sp.ptr;
use_count = sp.use_count;
++*use_count;
return *this;
#endif
}
template <typename T, typename Deleter>
shared_ptr<T, Deleter> &shared_ptr<T, Deleter>::operator= (shared_ptr<T, Deleter> &&sp)
{
std::swap(ptr, sp.ptr);
std::swap(use_count, sp.use_count);
return *this;
}
template <typename T, typename Deleter>
T* shared_ptr<T, Deleter>::get() const
{
return ptr;
}
template <typename T, typename Deleter>
void shared_ptr<T, Deleter>::reset(T *_ptr)
{
shared_ptr<T, Deleter>().swap(*this);
ptr = _ptr;
use_count = new atomic<int>(1);
}
template <typename T, typename Deleter>
void shared_ptr<T, Deleter>::swap(shared_ptr<T, Deleter> &sp)
{
std::swap(ptr, sp.ptr);
std::swap(use_count, sp.use_count);
}
template <typename T, typename Deleter>
int shared_ptr<T, Deleter>::count()
{
return *use_count;
}
};
int main(int argc, char *argv[])
{
{
smart_pointer::shared_ptr<int> p(new int(12));
smart_pointer::shared_ptr<int> p1(p);
*p1 = 2;
cout << *p << endl;
cout << p.count() << endl;
p = p;
cout << *p << endl;
cout << p.count() << endl;
}
{
smart_pointer::shared_ptr<int> p(new int(12));
p.reset(new int(13));
cout << *p << endl;
p = smart_pointer::shared_ptr<int>(new int(14));
cout << *p << endl;
smart_pointer::shared_ptr<int> p1(smart_pointer::shared_ptr<int>(new int(15)));
cout << *p1 << endl;
}
return 0;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-17428.html