基本思想:
1.每次创建新对象时,初始化指针对象并将引用计数初始化为1;
2.当对象作为另一个对象的副本而创建时,拷贝构造函数拷贝指针并增加相应的引用计数;
3.当一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果为0,则删除对象),并增加右操作数所指对象的引用计数;
4.调用析构函数是,减少引用计数就(如果引用计数减至0,则删除基础对象);
5.重载 -> 和 * 操作符,使得只能指针有类似于普通指针的操作;
template <typename T>
class SmartPtr
{
public:
SmartPtr(T* p = 0) {
m_ptr = p;
m_pRef = new size_t(1);
};
SmartPtr(const SmartPtr& src) {
m_ptr = src.m_ptr;
m_pRef = src.m_pRef;
}
SmartPtr<T>& operator= (const SmartPtr<T>& rhs){
++*(rhs.m_pRef); //m_pRef是指针,const保护的指针的指向(地址)不变
decrRef();
m_pRef = rhs.m_pRef;
m_ptr = rhs.m_ptr;
return *this;
};
T* operator-> () {
if (nullptr == m_pRef) {
std::cout << "null pointer error!" << std::endl;
}
return m_ptr;
};
T& operator* () {
if (nullptr == m_pRef) {
std::cout << "null pointer error!" << std::endl;
}
return *m_ptr;
};
~SmartPtr() {
decrRef();
std::cout << "Destructor!" << std::endl;
};
private:
size_t* m_pRef;
T* m_ptr;
void decrRef() {
if (0 == --*m_pRef) {
std::cout << "decrRef: delete ptr" << m_ptr << std::endl;
delete m_ptr;
m_ptr = NULL;
}
}
};