C++스마트 포인터 sharedptr 분석

C++스마트 포인터 sharedptr 분석
개요:
shared_ptr 는 c++스마트 포인터 에서 장면 이 많 고 기능 이 많은 스마트 포인터 입 니 다.그것 은 포인터 가 가리 키 는 자원 을 방출 하기 위해 수 를 인용 하 는 방법 을 채택 했다.다음은 제 코드 가 실현 하 는 기본 기능 입 니 다.
인 스 턴 스 코드:

template<class T>
class sharedptr
{
public:
  sharedptr(T* ptr)
  :_ptr(ptr)
  , _refCount(new int(1))
  {}

  sharedptr(sharedptr<T>& sp)
    :_ptr(sp._ptr)
    , _refCount(sp._refCount)
  {
    ++(*_refCount);
  }
  sharedptr& operator = (sharedptr<T>& sp) //    
  {
    swap(_ptr, sp._ptr);
    swap(_refCount, sp._refCount);
    return *this;
  }

  /*sharedptr& operator = (sharedptr<T>& sp)
  {
    if (this != &sp)
    {
      this->Release();

      _ptr = sp._ptr;
      _refCount = sp._refCount;
      ++(*_refCount);
    }
    return *this;
  }*/
  void Release()
  {
    if (--(*_refCount) == 0)
    {
      delete _ptr;
      delete _refCount;
    }
  }
  ~sharedptr()
  {
    Release();
  }
private:
  T* _ptr;
  int* _refCount;
};

그러나 이 는 기본 형식,예 int,double 형식 포인터 만 삭제 할 수 있 습 니 다.그러나 배열 지침 은 적용 되 지 않 는 다.c++에서 동적 메모리 관리 에서 new/delete 가 대응 하고 new[]/delete[]가 대응 하기 때문에 맞 춤 형 삭제 기 라 는 개념 을 도입 했다.
맞 춤 형 삭제 기의 기본 적 인 실현 은:

template<class T>
struct Delete
{
  void operator()(T* ptr)
  {
    delete ptr;
  }
};

template<class T>
struct DeleteArray
{
  void operator()(T* ptr)
  {
    delete[] ptr;
  }
};

어떻게 sharedptr 에서 사용 하고 있 습 니 다.내 려 와 서 코드 로 간단하게 시범 을 보 여 드 리 겠 습 니 다.

template<class T> //     
struct Delete
{
  void operator()(T* ptr)
  {
    delete ptr;
  }
};

template<class T>//     
struct DeleteArray
{
  void operator()(T* ptr)
  {
    delete[] ptr;
  }
};

template<class T, class D = Delete<T>>
class sharedptr
{
public:
  sharedptr(T* ptr, D del)
    :_ptr(ptr)
    , _refCount(new int(1))
    , _del(del)
  {}

  sharedptr(sharedptr<T>& sp)
    :_ptr(sp._ptr)
    , _refCount(sp._refCount)
  {
    ++(*_refCount);
  }
  sharedptr& operator = (sharedptr<T>& sp) //    
  {
    swap(_ptr, sp._ptr);
    swap(_refCount, sp._refCount);
    return *this;
  }

  /*sharedptr& operator = (sharedptr<T>& sp)
  {
    if (this != &sp)
    {
      this->Release();

      _ptr = sp._ptr;
      _refCount = sp._refCount;
      ++(*_refCount);
    }
    return *this;
  }*/
  void Release()
  {
    if (--(*_refCount) == 0)
    {
      printf("delete:0x%p
", _ptr); _del(_ptr); delete _refCount; } } ~sharedptr() { Release(); } private: T* _ptr; int* _refCount; D _del; };
호출 할 때 호출 함 수 를 이렇게 써 야 합 니 다:

void TextSharedptr()
{
  DeleteArray<int> da;
  sharedptr<int, DeleteArray<int>> sp(new int[3], da);

}

그리고 약 한ptr 약 인용 스마트 포인터(인용 계수 증가 하지 않 음)를 통 해 순환 인용 을 깨 뜨 린 다.
어떤 순환 인용 인지 간단하게 양 방향 링크 로 설명 할 수 있 습 니 다.

그리고 약 한ptr 는 계산 을 늘 리 지 않 는 방법 만 인용 하여 순환 인용 문 제 를 깼 다.하지만 weak 를 사용 하고 있 습 니 다.ptr 의 전 제 는 shared 를 사용 하 는 것 이 확실 합 니 다.ptr 스마트 포인터 에 이 문 제 를 반복 적 으로 참조 합 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기