栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 手写智能指针shared

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 手写智能指针shared

c++ 手写智能指针shared_ptr

留个坑,回头在填。

#include 
#include 
#include 
#include 

template
class shared_ptr {
    friend class shared_ptr;
    public:
        shared_ptr(T* ptr = nullptr) : m_ref(nullptr), m_obj(ptr) {
            std::cout << "构造函数" << std::endl;
            if(ptr) {
                m_ref = new size_t;
                *m_ref = 1;
            }
        }
        
        ~shared_ptr() noexcept {
            std::cout << "析构函数" << std::endl;
            if(m_ref) {
                --(*m_ref);
            }
            clearMem();
        }
        
        shared_ptr(const shared_ptr& other) {
            std::cout << "拷贝构造函数" << std::endl;
            m_ref = other.m_ref;
            ++ (*m_ref);
            m_obj = other.m_obj;
        }

        shared_ptr& operator=(const shared_ptr& other) {
            std::cout << "赋值运算符" << std::endl;
            if(m_obj == other.m_obj) {
                return *this;
            }
            if(m_obj) {
                --(*m_ref);
                clearMem();
            }
            m_ref = other.m_ref;
            m_obj = other.m_obj;
            ++ (*m_ref);
            return *this;
        }
        
        shared_ptr(shared_ptr&& other) : m_ref(nullptr), m_obj(nullptr){
            std::cout << "移动构造函数" << std::endl;
            other.swap(*this);
        }
        
        shared_ptr& operator=(shared_ptr&& other) {
            std::cout << "移动赋值运算符" << std::endl;
            if(m_obj) {
                --(*m_ref);
                clearMem();
            }
            other.swap(*this);
            return *this;
        }
        
        T& operator*() const { return *m_obj;}
        T* operator->() const { return m_obj;}
        operator bool() const { return m_obj;}
        
        void clearMem() noexcept {
            std::cout << "清理内存" << std::endl;
            if(!m_ref) {
                return;
            }
            if(*m_ref == 0 && m_obj) {
                delete m_ref;
                delete m_obj;
                m_ref = nullptr;
                m_obj = nullptr;
            }
        }
        
        void swap(shared_ptr& other) {
            if(&other == this) {
                return;
            }
            std::swap(this->m_obj, other.m_obj);
            std::swap(this->m_ref, other.m_ref);
        }
        
        T* get() {
            return m_obj;
        }
        
        void getMessage(const std::string& name) {
            if(m_ref) {
                std::cout << name << " ref " << m_ref << ": " << *m_ref << std::endl;
                return;
            }
            std::cout << name << " nullptr" << std::endl;
        }
        
        private:
            size_t* m_ref;
            T* m_obj;
};


struct person {
    int age = 0;
    bool sex = 0;
    person(int a, bool s) : age(a), sex(s) {}
};


int main() {
    std::cout << "---------测试构造函数----------" << std::endl;
    shared_ptr p1(new person(10, true));    // 测试构造函数
    p1.getMessage("p1");
    std::cout << "-------测试拷贝构造函数--------" << std::endl;
    shared_ptr p2(p1);                      // 测试拷贝构造函数
    p1.getMessage("p1");
    p2.getMessage("p2");
    shared_ptr p3(new person(9, false));    
    p3.getMessage("p3");
    std::cout << "------测试重载赋值运算符-------" << std::endl;
    p1 = p3;                                        // 测试重载赋值运算符
    p1.getMessage("p1");
    p2.getMessage("p2");
    p3.getMessage("p3");
    std::cout << "--------测试移动构造函数-------" << std::endl;
    shared_ptr p4(std::move(p3));           // 测试移动构造
    p1.getMessage("p1");
    p2.getMessage("p2");
    p3.getMessage("p3");
    p4.getMessage("p4");
    std::cout << "--------测试移动赋值运算符-------" << std::endl;
    p3 = std::move(p1);                             // 移动赋值运算符
    p1.getMessage("p1");
    p2.getMessage("p2");
    p3.getMessage("p3");
    p4.getMessage("p4");
    std::cout << "----------测试*和->的重载-------" << std::endl;
    std::cout << "*: " << p3->age << std::endl;
    std::cout << "->: " << (*p3).age << std::endl;
    return 0;
}
输出
---------测试构造函数----------
构造函数
p1 ref 0x5598a590a2e0: 1
-------测试拷贝构造函数--------
拷贝构造函数
p1 ref 0x5598a590a2e0: 2
p2 ref 0x5598a590a2e0: 2
构造函数
p3 ref 0x5598a590a320: 1
------测试重载赋值运算符-------
赋值运算符
清理内存
p1 ref 0x5598a590a320: 2
p2 ref 0x5598a590a2e0: 1
p3 ref 0x5598a590a320: 2
--------测试移动构造函数-------
移动构造函数
p1 ref 0x5598a590a320: 2
p2 ref 0x5598a590a2e0: 1
p3 nullptr
p4 ref 0x5598a590a320: 2
--------测试移动赋值运算符-------
移动赋值运算符
p1 nullptr
p2 ref 0x5598a590a2e0: 1
p3 ref 0x5598a590a320: 2
p4 ref 0x5598a590a320: 2
----------测试*和->的重载-------
*: 9
->: 9
析构函数
清理内存
析构函数
清理内存
析构函数
清理内存
析构函数
清理内存
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737745.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号