c++由于没有类似Java的垃圾自动回收机制,故而对于程序员来说,如何防止内存泄露是一个很关键的问题。
Effective C++中提到,用类对象来管理资源防止内存泄露。是的,通过对象来管理资源,这种对象就是所谓的智能指针了。
先贴上一个简单的源码:
#include<iostream>
using namespace std;
template<class T>
class auto_ptr{
public:
explicit auto_ptr(T* p=0):ptr(p){}
template<class U>
auto_ptr(auto_ptr<U> &rhs):ptr(rhs.release()){}
~auto_ptr(){delete ptr;}
template<class U>
auto_ptr<T> & operator=(auto_ptr<U>&rhs){
if(rhs!=this)
{
delete ptr;
ptr=rhs.release();
}
return *this;
}
T& operator*()const{return *ptr;}
T* operator->()const{return ptr;}
T* get()const {return ptr;}
T* release()const{
T *tmp=ptr;
(const_cast<auto_ptr<T>*>(this))->ptr=0;
return tmp;
}
private:
T* ptr;//管理的资源
};
对于智能指针的实现有四点需要注意:
一:由于智能指针不支持auto_ptr<T &a> po=a类似的隐式转换,故而需要将构造函数设置为explicit来阻止编译器作出隐式转换。
二:这个版本的智能指针实行的是一一对应的管理关系,故而所有权问题必然是一一对应,不能出现一个资源被两个智能指针管理或一个智能指针管理两个资源的情况。
三:实现的代码中拷贝构造函数和赋值构造函数用到的是成员模板函数,这是因为智能指针管理对象的时候是可以不分对象类型而进行获取管理所有权的。
四:实现指针一定要重载operator *和operator &这两个符号才能够称为指针,用来模拟指针行为。
以上便是简易版本的智能指针的实现,当然对于现在的编程情况来说这种auto_ptr没有引用计数很难解决二次释放的问题,故而还有一种基于共享型的指针称为shared_ptr这种智能指针提供了引用计数的概念避免了二次释放等问题。具体的shared_ptr指针的实现还在学习中。