智能指针是一个类,在类的构造函数中传入一个普通指针,析构函数释放指针。引入智能指针是为了更好的管理内存,防止内存泄漏等问题。
实现方法:采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。其遵循以下规则:
(1)每次创建类的新对象时,初始化指针并将引用计数置为1;
(2)当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;
(3)对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为0,则删除对象),并增加右操作数所指对象的引用计数;
(4)调用析构函数时,构造函数减少引用计数(若引用计数为0,则删除对象)。
template<typename T>
class smartPointer
{
public:
smartPointer(T* p):ptr(p)//构造函数
{
if (ptr)
count = new size_t(1);
else
count = new size_t(0);
}
smartPointer(const smartPointer& rhs)//拷贝构造函数
{
if (this != &rhs)
{
ptr = rhs.ptr;
count = rhs.count;
++(*count);
}
}
smartPointer& operator=(const smartPointer& rhs)//拷贝赋值运算符
{
if (this == &rhs)
return *this;
//左操作数引用计数减1
release_count();
//赋值使右操作数加1
this->ptr = rhs.ptr;
this->count = rhs.count;
++(this->count);
return *this;
}
T& operator*()//重载*运算符
{
assert(this->ptr != NULL);
return *(this->ptr);
}
T* operator->()//重载->运算符
{
assert(this->ptr != NULL);
return this->ptr;
}
~smartPointer()//析构函数
{
if (--(*count == 0))
{
delete count;
delete ptr;
ptr = NULL:
count = NULL;
}
}
private:
T* ptr;
size_t* count;
void release_count()
{
--(*count);
if (*count == 0)
{
delete count;
delete ptr;
ptr = NULL:
count = NULL;
}
}
};