智能指针代码实现:
用两个类来实现智能指针的功能,一个是引用计数类,另一个则是指针类。
引用计数类:包含两个数据成员: 引用的次数 所指的对象的指针
指针类:里面有一个指向引用计数类对象的指针
#include<iostream>
using namespace std;
template<typename T>
class Counter
{
private:
//数据成员
T* ptr;//对象指针
int cnt;//引用计数
template<typename T>
friend class SmartPtr;
//构造函数
Counter(T* p)
{
ptr = p;
cnt = 1;
}
~Counter()
{
delete ptr;
}
};
template<typename T>
class SmartPtr
{
private:
Counter<T>* ptr_cnt;
public:
SmartPtr(T* p)
{
ptr_cnt = new Counter<T>(p);
}
SmartPtr(const SmartPtr &other)
{
ptr_cnt = other.ptr_cnt;
ptr_cnt->cnt++;
}
SmartPtr& operator=(const SmartPtr &rhs)
{
//ptr_cnt = rhs->ptr_cnt;
rhs.ptr_cnt->cnt++;
ptr_cnt->cnt--;
if (ptr_cnt->cnt == 0)
{
delete ptr_cnt;
}
return *this;
}
T & operator*()
{
return ptr_cnt->cnt;
}
~SmartPtr()
{
ptr_cnt->cnt--;//调用析构时,先减1,再判断引用计数是否为0
if (ptr_cnt->cnt == 0)
{
delete ptr_cnt;
}
else
{
cout << "还有" << ptr_cnt->cnt << "个" << endl;
}
}
};
void test()
{
int *p = new int(42);
{
SmartPtr<int> sptr1(p);
{
SmartPtr<int> sptr2(sptr1);
{
SmartPtr<int> sptr3(sptr2);
}
}
}
cout << *p << endl;
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}