引言:
我们在写c++程序的时候,经常会因为忘记释放指针的资源从而导致内存泄漏,基于指针的这种缺陷,boost库中就提供了一种称之为“Smart Pointer"的类来解决这个问题,让程序自己控制已经不需要的资源的释放。后来”Smart Pointer”中的部分也移植到了c++标准库。
下面这些smart pointer的设计思想都是:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,然后在析构函数完成资源的清理,由于在在作用域结束的时候会自动调用析构函数,所以就起到了资源自动释放的效果。
auto_ptr
智能指针的实现都采用了泛型的思想,即可以用来操作任何类型的数据:内置类型,自定义。所以采用了模板类的实现方案作为框架。
因为智能指针要满足指针的一切操作,所以需要在内部实现->
,*
,=
等运算符的重载。基于以上这些思路,我们就足以实现一个最初版本的auto_ptr
- 最初版本的auto_ptr
template<typename T>
class AutoPtr{
public:
AutoPtr(T *p = NULL)
:_ptr(p)
{
}
AutoPtr(const AutoPtr<T> &a){
_ptr = a._ptr;
}
Auto<T>& operator=(const AutoPtr<T> &a){
if (this != &a){
_ptr = a._ptr;
a._ptr = NULL;
}
}
T& operator*(){
return *_ptr;
}
T& operator*(){
return *_ptr;
}
T* operator->(){
return _ptr;
}
~AutoPtr(){
if (_ptr){
delete _ptr;
}
}
private:
T *_ptr;
};
缺陷: 无法用多个指针操作同一块空间。
为了避免这个缺陷,我的解决思路是这样的:
提供一个当前标签,每一块空间只有一个指针拥有当前标签,而其他的指向这块空间的指针都具有使用权,在调用析构函数的时候,只有释放的指针具有当前标签的,才真正释放指针所指向的空间资源,这样就解决了上面的问题。
优化后的auto_ptr
:
template<typename T>
class AutoPtr
{
public:
AutoPtr(T *ptr = NULL) :
_ptr(ptr