1. 程式人生 > >淺析shared_ptr 和weak_ptr、定製刪除器

淺析shared_ptr 和weak_ptr、定製刪除器

   通過boost::weak_ptr來打破迴圈引用 ,由於弱引用不更改引用計數,類似普通指標,只要把迴圈引用的一方使用弱引用,即可解除迴圈引用
定製刪除器;
定製刪除器
為什麼在shared_ptr中介紹刪除器呢?(因為auto_ptr存在缺陷,scoped_ptr功能不全)
#define _CRT_SECURE_NO_WARNINGS   1
#include <iostream>
#include <memory>
 using namespace std;
// 定置的刪除器仿函式
 template<class T>//注意這裡有模版 
 struct Del
 {
      void operator()(const T* ptr)
      {
           delete ptr;
           cout << "delete" << endl;
      }
 };
 struct Free//注意這裡沒有模版 
 {
      void operator()(void* ptr)
      {
           free(ptr);
           cout << "free" << endl;
      }
 };
 struct Fclose
 {
      void operator()(void* ptr)
      {
           fclose((FILE*)ptr);
           cout << "fclose" << endl;
      }
 };
template<class T, class Deleter = Del<T>>
class SharedPtr
{
public:
     SharedPtr(T* ptr, Deleter del)
          :_ptr(ptr)
          , _pCount(new long(1))
          , _del(del)
     {}
     SharedPtr(T* ptr)
          :_ptr(ptr)
          , _pCount(new long(1))
     {}
     ~SharedPtr()
     {
          _Release();
     }
protected:
     void _Release()
     {
          if (--*_pCount == 0)
          {
              _del(_ptr);
              delete _pCount;
          }
     }
private:
     T* _ptr;
     long* _pCount;
     Deleter _del;
};
void Test()
{
     // 定製刪除器
     SharedPtr<int> p1(new int(1));
     // 定製刪除器和分配器
     SharedPtr<int, Free>sp2((int*)malloc(sizeof(int)* 10), Free());
}
int main()
{
     Test();
     system("pause");
     return 0; 
}