UDN-企业互联网技术人气社区

请简述智能指针原理,并实现一个简单的智能指针。

发布者: 一脸美人痣 | 发布时间: 2015-5-19 11:01| 查看数: 2022| 评论数: 3|帖子模式

请简述智能指针原理,并实现一个简单的智能指针。

最新评论

回复用户4 发表于 2015-5-19 11:24:10

  智能指针是一种资源管理类,通过对原始指针进行封装,在资源管理对象进行析构时对指针指向的内存进行释放;通常使用引用计数方式进行管理,一个基本实现如下:
  
  1. class Object;
  2. class SmartPointer;
  3. class Counter
  4. {
  5. friend class SmartPointer;
  6. public:
  7. Counter()
  8. {
  9.   ptr = NULL;
  10.   cnt = 0;
  11. }
  12. Counter(Object* p)
  13. {
  14.   ptr = p;
  15.   cnt = 1;
  16. }
  17. ~Counter()
  18. {
  19.   delete ptr;
  20. }
  21. private:
  22. Object* ptr;
  23. int cnt;
  24. };
  25. class SmartPointer
  26. {
  27. public:
  28. SmartPointer(Object* p)
  29. {
  30.   ptr_counter = new Counter(p);
  31. }
  32. SmartPointer(const SmartPointer &sp)
  33. {
  34.   ptr_counter = sp.ptr_counter;
  35.   ++ptr_count->cnt;
  36. }
  37. SmartPointer& operator=(const SmartPointer &sp)
  38. {
  39.   ++sp.ptr_counter->cnt;
  40.   --ptr_counter->cnt;
  41.   if (ptr_counter->cnt == 0)
  42.   {
  43.    delete ptr_counter;
  44.   }
  45.   ptr_counter = sp.ptr_counter;
  46. }
  47. ~SmartPointer()
  48. {
  49.   - -ptr_counter->cnt;
  50.   if (ptr_counter->cnt == 0)
  51.   {
  52.    delete ptr_counter;
  53.   }
  54. }
  55. private:
  56. Counter* ptr_counter;
  57. };
复制代码
大秀才 发表于 2015-5-26 16:07:01
  1. template<class T>
  2. class SmartPtr
  3. {
  4.   private:
  5.      T *ptr;
  6.      int  *counter;
  7. public:
  8.     SmartPtr(T *p):ptr(p),counter(new int(0))
  9.    {
  10.        if(p)
  11.          *counter = 1;
  12.    }
  13.    SmartPtr(const SmartPtr& rhs)
  14.    {
  15.        ++*rhs.counter;
  16.        ptr = rhs.ptr;
  17.        counter = rhs.couter;
  18.     }
  19.     SmartPtr& operator=(const SmartPtr& rhs)   
  20.     {
  21.         --*counter;
  22.        if(*counter == 0)
  23.           delete ptr;
  24.       ++*rhs.counter;
  25.       ptr = rhs.ptr;
  26.       counter = rhs.couter;
  27.     }
  28.     T* operator ->()
  29.    {
  30.        returnptr;
  31.    }
  32.    ~SmartPtr()
  33.    {
  34.        --*counter;
  35.        if(*counter==0)
  36.        {
  37.            delete ptr;
  38.            delete counter;
  39.            ptr=NULL;
  40.            count=NULL;
  41.        }
  42.    }
  43. }
复制代码
大黄蛰虫丸 发表于 2015-5-26 16:07:30
  1. /**
  2. *  智能指针,简单来讲是使用引用计数的方法,来跟踪监控指针。当引用计数为0时就delete 所跟踪的目标指针,释放内存
  3. *  智能指针将一个指针封装到一个类中,当调用智能指针的拷贝构造函数时,将引用计数+1(因为新创建的智能指针也引用了目标指针)
  4. *  重载智能指针的赋值操作符,等号左边的对象引用计数-1,右边的对象引用计数+1,右边的目标指针和引用计数赋值给左边的对象
  5. *  智能指针的析构函数将引用计数-1,并判断是否为0,如果是的话delete 目标指针。
  6. */
  7. template <class T>
  8. class smart_ptr
  9. {
  10. private:
  11.     T* ptr;
  12.     int* count;
  13. public:
  14.     smart_ptr(T* p=0):ptr(p),count(new int(0))
  15.     {
  16.         if(p)
  17.             *count=1;
  18.     }
  19.     smart_ptr(const smart_ptr& src)
  20.     {
  21.         ++*src.count;
  22.         count=src.count;
  23.         ptr=src.ptr;
  24.     }
  25.     smart_ptr& operator =(const smart_ptr& src)
  26.     {
  27.         --*count;
  28.         if(*count==0)
  29.             delete ptr;
  30.         count=src.count;
  31.         ptr=src.ptr;
  32.     }
  33.     const smart_ptr& operator =(const smart_ptr& src) const
  34.     {
  35.         --*count;
  36.         if(*count==0)
  37.             delete ptr;
  38.         count=src.count;
  39.         ptr=src.ptr;
  40.     }
  41.     T* operator ->()
  42.     {
  43.         return ptr;
  44.     }
  45.     ~smart_ptr()
  46.     {
  47.         --*count;
  48.         if(*count==0)
  49.         {
  50.             delete ptr;
  51.             delete count;
  52.             ptr=NULL;
  53.             count=NULL;
  54.         }
  55.     }
  56. };
复制代码
关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部