一篇文章带你搞定手写shared_ptr智能指针

主要就是个引用计数的思想,在构造函数的地方加一,拷贝构造函数的时候建议,但是rhs要加一计数。

#include <iostream>

using namespace std;

class share_count{
public:
    share_count():m_count(1){}
    void add_count(){
        ++m_count;
    }
    long reduce_count() 
    {
        --m_count;
        return m_count;
    }
    long get_count()const { return m_count;}
private:
    long m_count;
};

template<typename T>
class shared_ptr{
public:
    // shared_ptr() : m_ptr(nullptr) {}
    shared_ptr(T *ptr = nullptr) : m_ptr(ptr)
    {
        cout << "ctor" << endl;
        if (m_ptr)
        {
            m_count = new share_count();
        }
    }
    shared_ptr(const shared_ptr &rhs) noexcept
    {
        // cout << "cptor" << endl;
        if(m_ptr != nullptr)
            this->~shared_ptr();
        cout << &rhs << endl;
        m_ptr = rhs.m_ptr;
        m_count = rhs.m_count;
        m_count->add_count();
        // cout << m_count->get_count() << endl;
    }
    shared_ptr &operator=(const shared_ptr &rhs) noexcept
    {
        // cout << "operator =" << endl;
        if (m_ptr != nullptr)
            this->~shared_ptr();
        cout << &rhs << endl;
        m_ptr = rhs.m_ptr;
        m_count = rhs.m_count;
        m_count->add_count();
        // cout << m_count->get_count() << endl;
        return *this;
    }

    T& operator*()const { return *m_ptr;}
    T* operator->()const{return m_ptr;}
    operator bool() const { return m_ptr;}
    ~shared_ptr()
    {
        if(m_count != nullptr && m_ptr != nullptr){
            m_count->reduce_count();
            if (m_count->get_count() == 0)
            {
                cout << "~shared_ptr()" << endl;
                delete m_ptr;
                delete m_count;
                m_ptr = nullptr;
                m_count = nullptr;
            }
        }
    }
    long get_count() const { return m_count->get_count(); }
private:
    T* m_ptr = nullptr;
    share_count *m_count = nullptr;
};

int main(){

    shared_ptr<string> ptr_2(new string("Hello!"));

    // shared_ptr<string> ptr_3(ptr_2);
    // shared_ptr<string> ptr_4 = ptr_2;
    // cout << *ptr_3 << endl;
    // cout << *ptr_4 << endl;
    shared_ptr<string> ptr_5 = ptr_2;
    shared_ptr<string> ptr_6;
    ptr_6 = ptr_2;
    return 0;
}
#笔试#
全部评论
感谢楼主,像楼主这样直接上代码的不多啊
1 回复 分享
发布于 2022-06-17 12:19
提个意见,重载的赋值运算符应该要考虑自赋值的问题,如果直接先析构会出错
1 回复 分享
发布于 2022-06-22 00:16
楼主太强了,啥都不会的菜鸡选手只能默默仰望
1 回复 分享
发布于 2022-06-23 17:03
老哥24届都这么多实习了吗
点赞 回复 分享
发布于 2022-10-09 00:43 辽宁

相关推荐

11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
17 48 评论
分享
牛客网
牛客企业服务