首页 > 编程语言 > 详细

C++ Primer----智能指针类 2

时间:2014-04-15 05:04:12      阅读:548      评论:0      收藏:0      [点我收藏+]

指针带给了 C++巨大的灵活性,然而同样也带来无数的问题,悬挂指针,内存泄漏等。

int *pInt = new int(1);

// Do not forget
delete pInt;

智能指针就是一种能够有效避免悬挂指针的方法。通过一个类,来管理指针的复制,

delete 等。从而使用户可以放心地使用指针。


一种智能指针的实现方法是,通过一个计数,追踪当前指向同一块地址的指针有多少个,

当没有指针指向这块地址的时候,自动释放资源。从而有效地避免了 内存泄漏 和 悬挂指针问题。


// Last Update:2014-04-14 10:49:34
/**
 * @file smart-pointer.h
 * @brief Smart Pointer using reference counting
 * @author shoulinjun@126.com
 * @version 0.1.00
 * @date 2014-04-14
 */

#ifndef SMART-POINTER_H
#define SMART-POINTER_H
#include <iostream>

template<class T>
class SmartPointer
{
public:
  SmartPointer(T value)
    : ptr(new T(value)), ref_count(new size_t(1)) {}
  ~SmartPointer() { remove(); }

  //copy control
  SmartPointer(const SmartPointer &rhs);
  SmartPointer& operator=(const SmartPointer &rhs);

  T* get_ptr() {return ptr;}
  T get_ptr_val() {return *ptr;}
  T& operator*() {return *ptr;}
  const T& operator*()const {return *ptr;}
  T* operator->() {return ptr;}

private:
  T* ptr;
  size_t *ref_count;

protected:
  void remove(){
    if(--*ref_count == 0){
      delete ptr;
      delete ref_count;
      ptr = NULL;
      ref_count = NULL;
    }
  }
};

template<class T>
SmartPointer<T>::SmartPointer(const SmartPointer &rhs)
  :ref_count(rhs.ref_count), ptr(rhs.ptr)
{
  ++ *ref_count;
}

template<class T>
SmartPointer<T>& SmartPointer<T>::operator=(const SmartPointer &rhs)
{
  //deal with self-assignment
  ++ *(rhs.ref_count);
  remove();
  ptr = rhs.ptr;
  ref_count = rhs.ref_count;

  return *this;
}


#endif  /*SMART-POINTER_H*/


C++ Primer----智能指针类 2,布布扣,bubuko.com

C++ Primer----智能指针类 2

原文:http://blog.csdn.net/shoulinjun/article/details/23706717

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!