zoukankan      html  css  js  c++  java
  • shared_ptr,shared_ptr,enable_shared_from_this的理解

    0.shared_ptr和weak_ptr的实现方案
    说明:该方案完全是我自己YY出来的,是为了方便自己的理解智能指针的。另外,也帮助理解enable_shared_from_this。
     
    1.背景
    为了方便管理动态分配的内存,让申请的内存自动释放,天才们提出了智能指针的方法。
    既然你创造了一种新的技术,老的问题必将以新的形态出现。
    这里我指关注一个问题:
    如何使用智能指针?
    1.1 基本使用(shared_ptr)
    1.2 监控使用(shared_ptr)
    1.3 内部使用(enable_shared_from_this)
     
    2.实现
     
    shared_ptr(每个都包含有指向Counter的指针)
     
     
    Counter(包含shared_ptr和weak_ptr分别的计数,还包含“内存指针”)
    weak_ptr(每个都包含有指向Counter的指针)
     
     
    enable_shared_from_this(继承该类的子类对象都包含了一个weak_ptr)
     
    2.1 shared_ptr
    • 只有第一个shared_ptr才生成一个Counter,并将内存指针放到Counter中,shared_ptr计数+1 。
    • 之后又新的针对该内存指针的shared_ptr,都必须拷贝的方式获得指向Counter的指针,并且shared_ptr计数+1 。
    • 每销毁一个shared_ptr的时候,Counter的shared_ptr计数-1,当shared_ptr计数为0时,销毁内存
    • 当shared_ptr计数和weak_ptr计数同时为0时,销毁Counter
     
    2.2 weak_ptr
    • 当shared_ptr计数>0的时候,可以通过weak_ptr获得一个shared_ptr,当然shared_ptr计数+1 。
    • 没销毁一个weak_ptr的时候,weak_ptr计数-1,
    • 当shared_ptr计数和weak_ptr计数同时为0时,销毁Counter
     
    2.3 Counter
    • 存放了shared_ptr和weak_ptr计数
    • 存放了 内存指针
     
    2.4 enable_shared_from_this
    • 当继承该类的子类对象指针构造shared_ptr的时候,该对象可以获得一个weak_ptr
    • 当该子类对象需要传递自身指针给其他人使用的时候,必须传递一个shared_ptr
  • 相关阅读:
    zap日志库
    Go Logger库基本使用
    golang中的MySQL增删改查
    golang链接mysql
    文件上傳
    參數綁定:
    gin獲取path參數
    gin獲取form提交的表單數據
    獲取query string
    返回json
  • 原文地址:https://www.cnblogs.com/bluebbc/p/5198462.html
Copyright © 2011-2022 走看看