#include <atomic>
template<class T>
class AutoPtr
{
public:
AutoPtr(){
m_pData = nullptr;
m_pRef = nullptr;
}
~AutoPtr(){
Destroy();
}
AutoPtr(T *pData){
reset(pData);
}
AutoPtr(AutoPtr &prhs){
reset();
if (!prhs){
m_pData = prhs.get();
m_pRef = prhs.ref_count();
(*m_pRef)++;
}
}
AutoPtr & operator =(AutoPtr &prhs){
reset();
if (prhs){
m_pData = prhs.get();
m_pRef = prhs.ref_count();
(*m_pRef)++;
}
return *this;
}
AutoPtr & operator =(T *prhs){
reset(prhs);
return *this;
}
void reset(T *pData = nullptr){
Destroy();
if (pData){
m_pData = pData;
m_pRef = new atomic<int>(1);
}
}
T *get(){
return m_pData;
}
T& operator *(){
return *m_pData;
}
T* operator ->(){
return m_pData;
}
explicit operator bool() const{
return m_pData != nullptr;
}
bool operator !(){
return get() == nullptr;
}
bool operator ==(AutoPtr &pCompare) {
return pCompare.get() == m_pData.get();
}
bool operator != (AutoPtr &pCompare){
return pCompare.get() != m_pData.get()
}
atomic<int> * ref_count(){
return m_pRef;
}
private:
void Destroy(){
if (m_pRef ){
(*m_pRef)--;
if (*m_pRef == 0){
if (m_pData)
delete m_pData;
delete m_pRef;
}
}
m_pData = nullptr;
m_pRef = nullptr;
}
atomic<int> *m_pRef = nullptr; // 使用原子变量,允许智能指针的对象可跨线程访问
T* m_pData = nullptr;
};