使用一个指针指向一个动态对象,当不再使用的时候要销毁这个对象。如果会有多个指针指向同一个动态对象,那么需要知道,什么时候才能销毁这个对象。提前销毁对象可能导致指针指向并且销毁一个不存在的对象,不销毁则会是内存泄露。因此,有必要为指针设计一个引用计数机制,这个机制封装在一个类中。其实这就是一种智能指针。
http://blog.youkuaiyun.com/ojshilu/article/details/19353451
下面是一个数组类的实现,其中对数组内容实现的是浅拷贝方式,但采用引用计数。拷贝或赋值得到的对象将会使得引用计数发生变化。当计数器为0即没有指针指向该数组的生活,才会销毁数组内容。
template<typename T> class Array
{
private:
//count和data都用指针类型,对象共享一套
unsigned int *count;
T *data;
// 内部的对象清理函数
void Release()
{
(*count)--;
if(*count == 0)
{
if(data)
{
delete data;
data = NULL;
}
delete count;
count = NULL;
}
}
public:
// 构造函数:计数初始为1
Array(unsigned int size)
{
*count = 1;
if(size > 0)
data = new T;
}
// 拷贝构造函数:计数加1
Array(const Array& copy):data(copy.data), count(copy.count)
{
(*count)++:
}
//析构函数
~Array()
{
Release();
}
//赋值运算符重载
const Array& operator=(const Array& copy)
{
// 自身赋值检查
if(data == copy.data)
return *this;
Release;
data = copy.data;
count = copy.count;
(*count)++;
return *this;
}
}