内存管理一直是令程序员头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微的不小心就会导致内存泄漏(memory leak),野指针(wild pointer),访问越界(access denied)等问题。曾几何时,C++程序员无比羡慕JAVE,C#等语言的垃圾回收机制。但C++后来有了更高效的内存管理方法,智能指针的出现,使得C++在内存管理方面做得甚至比JAVE,C#更好。
智能指针(smart pointer)是C++中热门议题,在没有智能指针之前,程序员必须保证new的对象能在正确的时机dalete,四处编写异常捕获代码释放资源。而智能指针则可以在退出作用域时——不管是正常流程离开或是因异常而离开——总能调用delete来析构在堆上动态分配对象。
智能指针有很多种,今天介绍最简单,也是最有名的C++98标准中的“自动指针”std::auto_ptr。
智能指针的思想是,将构造成一个类似于指针的对象,对象在离开作用域时,会自动调动析构函数将对象析构,这就不用我们手动的去delete掉指针了。
auto_ptr的构造函数接受new操作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但是因为重载了operator*和operator->,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时,C++语言会保证auto_ptr对象销毁,调用auto _ptr的析构函数,进而使用delete操作符删除原始指针释放资源。
auto_ptr有两个版本,一个是pc版,指针涉及所有权问题;一个是gcc版本,指针不涉及所有权问题。
先讲解pc版本自动指针。下面列出pc版简写的auto_ptr代码:
template<class _Ty>
class auto_ptr
{
public:
auto_ptr(_Ty *_P=0) : _Owns(_P!=0),_Ptr(_P)
{}
auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release())
{}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y)
{
if(this != &_Y)
{
if(_Ptr != _Y._Ptr)
{
if(_Owns)
delete _Ptr;
}
//if(_Y._Owns)
// _Owns = true;
_Owns = _Y._Owns; //转移所有权
_Ptr = _Y.release();