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

实现一个shared

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

实现一个shared

实现一个简单的智能指针模板shared_ptr和unique_ptr

C++11新特性的智能指针,是C++提供的最小垃圾回收的机制,shared_ptr是一个模板,可以管理指针,并实现自动释放的效果,抹开标准库中shared_ptr对于其它场景的思考, 其核心原理是引用——删除机制,即对于对象的清理在于其引用的个数进行判断,如果没有对象引用这个堆空间,即count=0的时候,就会将其释放。而unique_ptr是独占, 无法拷贝和赋值,只能以移动语义传播,下面是一个简化版的Shared_ptr和Unique_ptr模板,用于理解shared_ptr和unique_ptr的运行原理

  • 支持get(), reset(), 解引用, ->运算符等常用API
  • 没有考虑锁,只是用一个简单的counter字段来记录对Shared_ptr的引用
Shared_ptr
#include 

using namespace std;

template
class Shared_ptr{
public:

    template
    explicit Shared_ptr(ParametersTy&&... args) noexcept :ty(new StoreTy())
    {
        ty->t = new Ty(forward(args)...);
    }

    explicit Shared_ptr(Ty* p) noexcept :ty(new StoreTy())
    {
        ty->t = p;
    }

    Shared_ptr(const Shared_ptr& p) noexcept : ty(p.ty)
    {
        ty->count++;
    }

    ~Shared_ptr() noexcept
    {
        if(flag){
            ty->count--;
            if(ty->count == 0)
            {
                delete ty->t;
                delete ty;
            }
        }
    }

    size_t use_count() const { return ty->count; }

    Ty* get(){return ty->t;}

    void reset() noexcept
    {
        if(flag)
        {
            flag = false;
            ty->count--;
            if(ty->count == 0)
            {
                delete ty->t;
                delete ty;
            }
        }
    }

    Ty* operator->(){return ty->t;}

private:
    struct StoreTy{
        Ty *t{nullptr};
        int count{1};
    };

    bool flag{true};
    StoreTy* ty;
};

struct Value1{
    void print() { cout << "I am test type Value2n"; }
};

int main()
{
    Shared_ptr p;
    {
        auto p1 = p;
        p1->print();
        p.reset();
        cout<<"Use count "< 
Unique_ptr 
  • 支持unique_ptr特性的模板
#include 

using namespace std;

template
class Unique_ptr{
public:
    template
    explicit Unique_ptr(ParameterTy&& ...args) noexcept : ty(new Ty(std::forward(args)...)){}

    Unique_ptr(Unique_ptr&& ptr) noexcept : ty(ptr.ty)
    {
        ptr.ty = nullptr;
    }

    ~Unique_ptr() noexcept {
        if(ty) delete ty;
        ty = nullptr;
    }

    Ty* get(){ return ty; }

    Ty operator*(){ return *ty; }

    Ty* operator->(){ return ty; }

    void reset() noexcept
    {
        if(ty) delete ty;
        ty = nullptr;
    }
private:
    Unique_ptr(const Unique_ptr& p) = delete;
    Unique_ptr operator=(const Unique_ptr& p) = delete;
    Ty* ty;
};

int main(){
    Unique_ptr a(10);
    Unique_ptr c = std::move(a);
    auto e = c;     // 报错,不支持拷贝和赋值
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997266.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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