当前位置: 首页 > news >正文

青岛正规网站建设哪家便宜图片转链接在线转换

青岛正规网站建设哪家便宜,图片转链接在线转换,前端程序员需要掌握哪些基本技术,海淀教育人才网站在 C 中,弱指针(std::weak_ptr)是一种特殊的智能指针,其核心目标是‌解决 std::shared_ptr 的循环引用问题‌,同时不增加对象的引用计数。它的实现原理基于与 std::shared_ptr 共享的 ‌控制块(Control Blo…

在 C++ 中,弱指针(std::weak_ptr)是一种特殊的智能指针,其核心目标是‌解决 std::shared_ptr 的循环引用问题‌,同时不增加对象的引用计数。它的实现原理基于与 std::shared_ptr 共享的 ‌控制块(Control Block)‌,并通过 ‌弱引用计数(Weak Reference Count)‌ 管理资源生命周期。

1. 弱指针的设计目标

  • 打破循环引用‌:当两个 std::shared_ptr 互相引用时,引用计数无法归零,导致内存泄漏。std::weak_ptr 不增加引用计数,允许安全观测对象是否存在。
  • 临时访问资源‌:通过 lock() 方法临时获取 std::shared_ptr,确保访问时对象存活。

2. 核心实现原理

(1) 控制块(Control Block)
  • 数据结构‌:
    每个由 std::shared_ptr 管理的对象会关联一个 ‌控制块‌,包含以下信息:

    • 强引用计数(Strong Ref Count)‌:当前 std::shared_ptr 的引用数量。
    • 弱引用计数(Weak Ref Count)‌:当前 std::weak_ptr 的引用数量。
    • 对象指针‌(若强引用计数 > 0,否则为 nullptr)。
    • 删除器(Deleter)‌ 和 ‌分配器(Allocator)‌(可选)。
  • 生命周期‌:

    • 当 ‌强引用计数归零‌ 时,对象被销毁(调用析构函数并释放内存)。
    • 当 ‌弱引用计数归零‌ 时,控制块自身被释放。
(2) std::weak_ptr 的构造
  • 从 std::shared_ptr 构造‌:

std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp(sp);  // 不增加强引用计数,但增加弱引用计数
    • wp 共享 sp 的控制块,弱引用计数 +1。
  • 从另一个 std::weak_ptr 构造‌:

std::weak_ptr<int> wp2(wp);  // 弱引用计数 +1
    (3) std::weak_ptr 的使用
    • lock() 方法‌:
      尝试将 std::weak_ptr 提升为 std::shared_ptr

    if (auto sp = wp.lock()) {  // 若对象存活,强引用计数 +1// 安全使用 sp
    }
    
      • 若对象已销毁(强引用计数为 0),返回空的 std::shared_ptr
    • expired() 方法‌:
      快速检查对象是否存活(无需创建 std::shared_ptr):

    if (!wp.expired()) {  // 检查强引用计数是否 > 0// 对象存活
    }
    

    3. 内部实现细节

    (1) 控制块的内存管理
    • std::shared_ptr 构造时‌:
      若首次创建 std::shared_ptr,动态分配控制块,强引用计数初始化为 1,弱引用计数初始化为 1(因为 std::shared_ptr 自身也持有一个弱引用)。

    • std::weak_ptr 构造时‌:
      弱引用计数 +1,但不影响强引用计数。

    • std::shared_ptr 析构时‌:
      强引用计数 -1。若强引用计数归零:

      1. 销毁对象(调用析构函数并释放内存)。
      2. 若弱引用计数也为 0‌,释放控制块;否则保留控制块供 std::weak_ptr 查询。
    • std::weak_ptr 析构时‌:
      弱引用计数 -1。若弱引用计数归零且强引用计数已为 0,释放控制块。

    (2) 线程安全性
    • 引用计数的原子操作‌:
      控制块的引用计数(强/弱)通过原子操作(如 std::atomic)实现线程安全。

    4. 示例:解决循环引用

    #include <memory>
    class Node {
    public:std::shared_ptr<Node> next;std::weak_ptr<Node> prev;  // 使用 weak_ptr 打破循环引用
    };int main() {auto node1 = std::make_shared<Node>();auto node2 = std::make_shared<Node>();node1->next = node2;      // node2 强引用计数 = 2node2->prev = node1;      // node1 弱引用计数 = 1// node1 和 node2 的强引用计数最终可归零,正确释放内存
    }
    

    5. 性能与限制

    • 性能开销‌:

      • std::weak_ptr 的创建、销毁和 lock() 涉及原子操作,略慢于裸指针。
      • 控制块占用额外内存(通常为 2~3 个指针大小)。
    • 使用限制‌:

      • 必须通过 lock() 获取 std::shared_ptr 后才能访问对象。
      • 无法直接访问对象的原始指针(需先调用 lock())。

    总结

    std::weak_ptr 通过 ‌共享控制块‌ 和 ‌分离强/弱引用计数‌ 的机制,实现了对 std::shared_ptr 管理对象的安全观测。其核心价值在于:

    1. 打破循环引用‌,避免内存泄漏。
    2. 临时访问资源‌,确保访问时对象存活。
      它是现代 C++ 内存管理中不可或缺的工具,尤其适用于观察者模式、缓存管理等场景。

    http://www.dtcms.com/a/603942.html

    相关文章:

  • 佛山企业网站设计制作重庆市建设工程信息网安
  • 网站建设平台怎么样临河做网站
  • app免费制作网站哪个好android开发用什么软件
  • 桂林做手机网站建设公司网站名词解释
  • 莱州网站建设方案建盏
  • 台州网站推广江苏网站开发
  • 网站建设比较牛的企业美橙网站维护
  • 网站建设 入门知识typecho前端建站工具
  • 网站备案名字数学老师做直播的网站
  • 学网站开发需要报培训机构吗邯郸房产网最新楼盘
  • 网站那个做的比较好的公司网站优化哪家好
  • 做点心的网站微商城网站策划
  • 上海做网站多少费用学创杯营销之道模板
  • 做企业网站需要多久桂林漓江景点介绍
  • 软件网站建设logo123
  • 学做立体书的网站哪个网站做头像比较好
  • 企业建设网站的目标集团网站建设哪家好
  • 西宁网站建设电话做阿里巴巴跟网站哪个更好
  • 佛山网站设计公司工程信息价在哪查询
  • 怎么做商业网站模板wordpress更换域名打不开
  • 阳新网站建设手机编写html网页的软件
  • 国外做设计赚钱的网站搜索引擎优化到底是优化什么
  • 邯郸网站建设公司哪家好自己建设网站在哪里建设
  • 绍兴网站建设报价如何在网站上做咨询浮动窗口
  • 珠海手机网站建设公司wordpress汉化免费企业主题
  • 湖州网站建设服务超详细wordpress
  • 录音转文字网站开发业务外包服务公司
  • 凯里网站制作干零活一天一结的平台
  • 寮步网站建设公司seo外包杭州
  • 注册网站会不会有风险深圳企业网站建设电话