C++ 智能指针简单实现

复制代码
#pragma once
template<typename TR>
class joker_shared_ptr
{
private:
     TR * ptr;
     size_t * count;
public:
    constexpr joker_shared_ptr(/* args */)noexcept{ }
    constexpr joker_shared_ptr(std::nullptr_t )noexcept { }
    explicit joker_shared_ptr(TR * ptr):ptr(ptr),count(new size_t(1)){ }
    ~joker_shared_ptr()
    {
        if(count != nullptr && (*count) > 1)
        {
            (*count) -- ;
            return;
        }

        if(count != nullptr )   
        delete  count;
        if(ptr !=  nullptr )  
        delete ptr;

    }
    joker_shared_ptr(const joker_shared_ptr &other)noexcept:ptr(other.ptr),count(other.count)
    {
        if(count != nullptr)
        {
            (*count)++;
        }
    }

    joker_shared_ptr& operator=(const joker_shared_ptr & other)noexcept
    {
        if (this->get() == other.get()) {
            return *this;
        }

        if(count != nullptr)
        {
            (*count)--;
            if(*count == 0)
            {
                delete count;
                if(ptr != nullptr)
                    delete ptr;
            }
        }

        count = other.count;
        ptr = other.ptr;
        if(count != nullptr && ptr != nullptr)
        {
            (*count)++;
        }
        return *this;
    }

    size_t use_count() const noexcept
    {
        if( count != nullptr)
        {
            return *count;
        }
        else
        {
            return 0;
        }
    }

    TR* get()const noexcept
    {
       
        return ptr;

    }

    TR& operator*() const noexcept
    {
        return *ptr;
    }
};
#if 0
template<typename TR>
joker_shared_ptr<TR>& joker_shared_ptr<TR>::operator=(const joker_shared_ptr & other)noexcept
{
    if(count != nullptr)
    {
        (*count)--;
        if(*count == 0)
        {
            delete count;
            if(ptr != nullptr)
                delete ptr;
        }
    }

    count = other.count;
    ptr = other.ptr;
    if(count != nullptr && ptr != nullptr)
    {
        (*count)++;
    }
    return *this;
}
#endif
复制代码

 

posted @   joker_2255  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示