您的位置:首页 > 其它

算法24:智能指针的原理和使用

2017-03-30 17:39 369 查看

c++代码

template <typename T>
class SmartPtr
{
public:
SmartPtr(T* p = 0):ptr(p),count(new int(1)){}
//复制构造函数
SmartPtr(const SmartPtr& sp):ptr(sp.ptr),count(sp.count)
{
++count;
}
//重载赋值操作符
SmartPtr& operator=(const SmartPtr& rp)
{
++*rp.count;
DecCount();
ptr = rp.ptr;
count = rp.count;
return *this;
}

//重载赋值操作符
SmartPtr& operator=(SmartPtr& rp)
{
++*rp.count;
DecCount();
ptr = rp.ptr;
count = rp.count;
return *this;
}

~SmartPtr()
{
DecCount();
}

private:
void DecCount()
{
if(--*count <= 0)
{
delete ptr;
delete count;
ptr = NULL;
count = NULL;
}
}
private:
T* ptr;
int* count;
};


智能指针一种通用的方法就是采用引用计数的方法,将智能指针与类的对象联系在一起,引用计数共有多少个对象共享同一个指针。

当创建新对象时,初始化指针并设置计数器为1。

当对象作为另外一个对象副本创建时,拷贝构造函数拷贝指针并且增加计数器的值。

当对一个对象赋值时,赋值操作符减少左操作数所指对象的计数器(当计数器被减为0时,删除对象),并增加右操作数所指的引用计数。

调用析构函数时,减少引用计数(当计数器被减为0时,删除对象)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法