zoukankan      html  css  js  c++  java
  • 计数型智能指针

    #include<iostream>
    using namespace std;

    template <typename T>
    class my_shared_ptr
    {
    public:

    my_shared_ptr();
    my_shared_ptr(T* p);
    my_shared_ptr(my_shared_ptr<T>& p);
    my_shared_ptr<T> operator=(my_shared_ptr<T>& p);
    ~my_shared_ptr();
    void show_cnt()
    {
    if(p_count==NULL||m_p==NULL)
    {
    cout<<"nullptr of my_shared_ptr"<<endl;
    return;
    }
    cout<<*p_count<<endl;
    }

    private:

    int* p_count;
    T* m_p;
    };
    int main()
    {
    my_shared_ptr<int> p1(new int(100));
    p1.show_cnt();

    my_shared_ptr<int> p2(p1);
    p1.show_cnt();
    p2.show_cnt();

    my_shared_ptr<int> p3;
    p3=p1;
    p1.show_cnt();
    p2.show_cnt();
    p3.show_cnt();

    my_shared_ptr<int> p4;

    cout<<"...."<<endl;
    my_shared_ptr<int> pB1(new int(200));
    my_shared_ptr<int> pB2(pB1);
    pB1 = p1;
    p1.show_cnt();
    p2.show_cnt();
    p3.show_cnt();
    pB2.show_cnt();

    return 0;
    }

    template <typename T>
    my_shared_ptr<T>::my_shared_ptr()
    {
    p_count = NULL;
    m_p = NULL;
    }

    template <typename T>
    my_shared_ptr<T>::my_shared_ptr(T* p)
    {
    if(NULL!=p)
    {
    p_count = new int(1);
    m_p = p;
    p=NULL;
    }
    }

    template <typename T>
    my_shared_ptr<T>::my_shared_ptr(my_shared_ptr<T>& p) // copy construct
    {
    if(NULL==p.m_p||NULL==p.p_count||0==*(p.p_count))
    {
    m_p=NULL;
    p_count = NULL;
    return;
    }
    m_p = p.m_p;
    p_count = p.p_count;
    (*p_count)++;
    }

    template <typename T>
    my_shared_ptr<T> my_shared_ptr<T>::operator=(my_shared_ptr<T>& p)
    {
    if(NULL==p.m_p||NULL==p.p_count||0==*(p.p_count)) // 参数指针是个无效指针
    {
    return *this;
    }
    if(m_p==NULL||NULL==p_count||0==*p_count) // 被赋值指针原本不指向对象
    {
    m_p=p.m_p;
    p_count=p.p_count;
    (*p_count)++;
    }
    else
    {
    if(0==--*p_count) // 被赋值指针计数减少1
    {
    delete p_count;
    delete m_p;
    p_count=NULL;
    m_p = NULL;
    }
    p_count = p.p_count;
    m_p = p.m_p;
    ++*p_count;
    }

    return *this;
    }

    template <typename T>
    my_shared_ptr<T>::~my_shared_ptr()
    {
    if(p_count!=NULL||m_p!= NULL)
    {
    (*p_count)--;
    if(*p_count==0)
    {
    delete m_p;
    }
    m_p=NULL;
    }
    }

  • 相关阅读:
    AngularJS中写一个包裹HTML元素的directive
    AngularJS中实现Model缓存
    控制台获取AngularJS某个元素的Scope
    体验jQuery和AngularJS的不同点以及AngularJS的迷人之处
    AngularJS中$interval的用法
    AngularJS中处理多个promise
    AngularJS中获取数据源的几种方式
    AngularJS中ui-router全攻略
    AnguarJS中链式的一种更合理写法
    AngularJS转换请求内容
  • 原文地址:https://www.cnblogs.com/fchy822/p/8944261.html
Copyright © 2011-2022 走看看