C++标准库中提供的auto_ptr智能指针是没有计数功能,它进行的是指针的移交。指针移交完成后,原来的“指针”就不复存在了。但是实际当中需要维护多个指针指向同一内存单元。这个时候需要另外一种智能指针来对指向该内存空间的指针进行维护。在boost库中提供了相应的智能指针。
下面这段代码是在学习《C++标准程序库》中“动手实现Reference语义”中实现的计数型智能指针。
template <class T>
class CountedPtr
{
private:
T* ptr;
long *count;
public:
explicit CountedPtr(T* p=0)
:ptr(p),count(new long(1)){}
CountedPtr(const CountedPtr<T>& p)throw()
:ptr(p),count(p.count){
++*count;
}
~CountedPtr()throw()
{
dispose();
}
CountedPtr<T>& opreator= (const CountedPtr<T>& p)throw()
{
if(this != p)
{
dispose();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}
T& opreator*() const throw()
{
return *ptr;
}
T* operator->()const throw()
{
return ptr;
}
private:
void dispose()
{
if(--*count == 0)
{
delete count;
delete ptr;
}
}
};