c++智能指针auto_ptr的实现

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指针的实现还在学习中。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值