原理:用一个数去统计指向堆中的无名对象指针的个数,由最后一个指针去释放其空间。为了保持同步,应该使这个数也只有一份。
简单实现如下
//SmartPtr.h
#pragma once
#include <iostream>
using namespace std;
template <class T>
class CSmartPtr
{
public:
CSmartPtr():m_ptr(NULL),m_count(NULL)
{
}
CSmartPtr( T* ptr):m_count(new int(1)),m_ptr(ptr)
{
}
~CSmartPtr()
{
if(m_count!= NULL)
{
(*m_count)--;
if( *m_count<=0 && m_ptr!= NULL)
{
delete m_ptr;
delete m_count;
}
}
}
CSmartPtr(const CSmartPtr<T>& CPtr)
{
m_ptr=CPtr.m_ptr;
if(CPtr.m_ptr != NULL)
{
(*CPtr.m_count)++;
}
m_count=CPtr.m_count;
}
CSmartPtr<T>& operator =(const CSmartPtr<T>& CPtr)
{
if(this != &CPtr)//不是自己给自己赋值
{
(*m_count)--;
if((*m_count<=0) && (m_ptr!= NULL) )
{
delete m_ptr;
}
m_ptr=CPtr.m_ptr;
if(CPtr.m_ptr != NULL)
{
(*CPtr.m_count)++;
}
m_count=CPtr.m_count;
}
return *this;
}
bool operator !=(const CSmartPtr<T>& CPtr)
{
return (m_ptr != CPtr.m_ptr);
}
bool operator ==(const CSmartPtr<T>& CPtr)
{
return (m_ptr == CPtr.m_ptr);
}
T* operator ->()
{
return m_ptr;
}
T* GetPtr()
{
return m_ptr;
}
int GetCount()
{
return (*m_count);
}
private:
T *m_ptr;
int *m_count;
};
//test.cpp
#include "SmartPtr.h"
#include <string>
class CTest
{
public:
CTest(string name):m_name(name)
{
cout<<m_name<<" Construction.\n";
}
~CTest()
{
cout<<m_name<<" Destructor.\n";
}
private:
string m_name;
};
void main()
{
CSmartPtr<CTest> ptr1= new CTest("test1");
CSmartPtr<CTest> ptr2(NULL);
CSmartPtr<CTest> ptr3;
ptr2=ptr1;
}