smart_ptr.hpp
#pragma once #include <cstdint> #include <memory> template <class T> class smart_ptr { private: T* _obj; uint32_t _count; void add(); void dec(); protected: public: smart_ptr(T* obj_); smart_ptr(const smart_ptr&); smart_ptr& operator =(const smart_ptr&); ~smart_ptr(); }; template <class T> inline smart_ptr<T>::smart_ptr(T* obj_) : _obj(obj_), _count(1) {}
template <class T> inline smart_ptr<T>::smart_ptr(const smart_ptr& that) { memcpy_s(this, sizeof(smart_ptr), &that, sizeof(smart_ptr)); add(); } template <class T> inline smart_ptr<T>& smart_ptr<T>::operator =(const smart_ptr& that) { if (&that == this) { return *this; } dec(); memcpy_s(this, sizeof(smart_ptr), &that, sizeof(smart_ptr)); add(); return *this; } template <class T> inline smart_ptr<T>::~smart_ptr() { dec(); } template <class T> inline void smart_ptr<T>::add() { _MT_INCR(_count); } template <class T> inline void smart_ptr<T>::dec() { if (_MT_DECR(_count) == 0) { delete _obj; } }
采用引用计数的方式进行管理,简单明了
inline smart_ptr<T>::smart_ptr(T* obj_) : _obj(obj_), _count(1) {}