shared_ptr

#include <assert.h>
#include <cstddef>
#include <iostream>

using namespace std;

template <typename T>
class SmartPointer{
    public:
        SmartPointer(T * ptr = 0) : ptr_(ptr){
            if(ptr_ != 0)
                cnt_ = new size_t(1);
            else
                cnt_ = NULL;
        }

        SmartPointer(const SmartPointer& src){
            if(src.ptr_ != NULL){
                ptr_ = src.ptr_;
                cnt_ = src.cnt_;
                *cnt_++;
            }
            else
            {
                ptr_ = NULL;
                cnt_ = NULL;
            }
        }

        SmartPointer& operator=(const SmartPointer& src){
            if(ptr_ != src.ptr_){
                releaseCnt();
                if(src.ptr_ != NULL){
                    ptr_ = src.ptr_;
                    cnt_ = src.cnt_;
                    *cnt_++;      
                }
                else{
                    ptr_ = NULL;
                    cnt_ = NULL;                    
                }
            }
            return *this;
        }

        ~SmartPointer(){
            releaseCnt();
        }

        T& operator*(){
            assert(ptr_ != NULL);
            return *ptr_;
        }

        T* operator->(){
            assert(ptr_ != NULL);
            return ptr_;
        }

        size_t getCnt(){
            if(cnt_ != NULL)
                return *cnt_;
            else
                return 0;
        }
    private:
        T * ptr_;
        size_t * cnt_;
        void releaseCnt(){
            if(ptr_){
                (*cnt_)--;
                if(*cnt_ == 0){
                    delete ptr_;
                    delete cnt_;
                }
            }
        }
};




int main(){
    //test1 
    cout << "start test1:"<<endl;
    SmartPointer<int> s1(new int(1));
    SmartPointer<int> s2 = s1;
    cout << "s1.cnt: " << s1.getCnt() <<endl;
    cout << "s2.cnt: " << s2.getCnt() <<endl;    
    cout << "end test1:"<<endl;

    //test2
    cout << "start test2:"<<endl;
    SmartPointer<int> s3;
    SmartPointer<int> s4(new int(1));
    s3 = s4;
    cout << "s3.cnt: " << s3.getCnt() <<endl;
    cout << "s4.cnt: " << s4.getCnt() <<endl;     
    cout << "end test2:"<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值