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

安宁网站建设 熊掌wordpress建站显示网站图标

安宁网站建设 熊掌,wordpress建站显示网站图标,织梦系统网站搭建教程,东莞工厂《Effective Modern C》第4章 Smart Pointers 一、使用 std::unique_ptr 管理独占所有权(Item 18)基本概念 std::unique_ptr 提供对动态分配资源的独占所有权管理。与裸指针不同,unique_ptr 在离开作用域或被重置时自动释放所管理的资源。它…

《Effective Modern C++》第4章 Smart Pointers

一、使用 std::unique_ptr 管理独占所有权(Item 18)

  1. 基本概念
    std::unique_ptr 提供对动态分配资源的独占所有权管理。与裸指针不同,unique_ptr 在离开作用域或被重置时自动释放所管理的资源。它禁止拷贝,只能移动。

  2. 使用方式
    推荐工厂函数方式创建:

    auto up = std::make_unique<Foo>(arg1, arg2);
    

    当需要转移所有权时:

    std::unique_ptr<Foo> up2 = std::move(up);
    // 此时 up 为空,up2 拥有资源
    
  3. 自定义删除器
    对于非 new 分配的资源,如 FILE* 或自定义句柄,可传入删除器类型:

    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen("data.txt", "r"), &fclose);
    

    删除器在 unique_ptr 析构时被调用,保证资源释放。

  4. 注意事项

    • 禁止拷贝可防止重复释放;
    • 作为成员变量时,可用 = default 或手动定义移动构造/赋值;
    • 不要将裸指针与 unique_ptr 混合管理同一资源。

二、使用 std::shared_ptr 管理共享所有权(Item 19)

  1. 基本概念
    std::shared_ptr 通过内部控制块维护引用计数,允许多方共享同一对象。最后一个 shared_ptr 析构时,自动释放资源。

  2. 使用方式
    推荐工厂函数:

    auto sp1 = std::make_shared<Foo>(arg);
    auto sp2 = sp1;   // 引用计数增至 2
    sp1.reset();      // 计数减至 1
    // 最后 sp2 离开作用域时释放 Foo
    
  3. 性能与成本

    • 控制块与对象默认一次分配;
    • 引用计数操作是原子级别开销;
    • 拷贝和析构时都要修改计数。
  4. 循环引用问题
    当对象 A 和 B 相互持有 shared_ptr,会导致引用计数永不归零。必须通过 weak_ptr 打破循环。

三、使用 std::weak_ptr 管理可能失效的观察型指针(Item 20)

  1. 基本概念
    std::weak_ptr 是对 shared_ptr 管理资源的非拥有型引用,不增加引用计数。它记录 control block 的弱引用,可检测资源是否已释放。

  2. 使用方式

    std::shared_ptr<Foo> sp = std::make_shared<Foo>();
    std::weak_ptr<Foo> wp = sp;  // 计数不变if (auto guard = wp.lock()) {// guard 为 shared_ptr,安全访问guard->method();
    } else {// 对象已销毁
    }
    
  3. 应用场景

    • 观察者模式、缓存实现、回调注册时,不希望延长对象生命周期;
    • 打破 shared_ptr 循环引用的一端。
  4. 注意事项

    • 使用 lock() 获取 shared_ptr 并检查是否为空;
    • 避免直接将 weak_ptr 转为裸指针;
    • expired() 可用于简单过期检测,但 lock() 更安全。

四、优先使用 std::make_unique 和 std::make_shared(Item 21)

  1. 问题及原因
    直接 new 后再构造智能指针存在两次内存分配和潜在异常安全漏洞:一旦在 new 后抛出,容易泄漏。

  2. make 工厂函数优势

    • 单次内存分配:make_shared 在一次分配中创建控制块和对象;
    • 异常安全:资源在构造过程中即被智能指针管理,不会泄漏。
  3. 示例对比

    // 不推荐
    std::unique_ptr<Foo> up(new Foo(args));
    std::shared_ptr<Foo> sp(new Foo(args));// 推荐
    auto up2 = std::make_unique<Foo>(args);
    auto sp2 = std::make_shared<Foo>(args);
    
  4. 特殊情况

    • 需要自定义删除器时,仍需手动 new 并传入删除器;
    • make_shared 无法分离控制块内存,若希望控制释放时机可考虑手动创建。

五、Pimpl 习惯用法中在实现文件定义特殊成员函数(Item 22)

  1. Pimpl 模式目的
    隐藏实现细节、减少头文件依赖、加快编译速度。头文件中声明不完整类型,实际数据保存在实现类 Impl 中。

  2. 头文件示例(Widget.h)

    class Widget {
    public:Widget();~Widget();Widget(const Widget&);Widget& operator=(const Widget&);
    private:struct Impl;std::unique_ptr<Impl> pImpl;
    };
    
  3. 实现文件示例(Widget.cpp)

    struct Widget::Impl {// 数据成员
    };Widget::Widget() : pImpl(std::make_unique<Impl>()) {}
    Widget::~Widget() = default;
    Widget::Widget(const Widget& w): pImpl(std::make_unique<Impl>(*w.pImpl)) {}
    Widget& Widget::operator=(const Widget& w) {*pImpl = *w.pImpl;return *this;
    }
    
  4. 原因与好处

    • Impl 定义对外部不可见,确保封装性;
    • 修改 Impl 后只需重新编译 cpp,减少依赖传播;
    • 特殊成员函数在 cpp 中定义时,Impl 完整可见,避免不完整类型使用错误。

总结

本章围绕智能指针的五个核心要点展开,从独占所有权到共享所有权,再到观察型 weak_ptr,以及工厂函数与 Pimpl 相结合的模式实践,全面阐明了现代 C++ 中资源管理的最佳实践。通过合理选用 unique_ptr、shared_ptr 和 weak_ptr,并配合 make_xxx 工厂函数和 Pimpl 隐藏实现细节,能够编写安全、高效且易于维护的 C++ 应用。


文章转载自:

http://HJy2Ulhw.rgyts.cn
http://Q5oRBaei.rgyts.cn
http://NBuxCPxy.rgyts.cn
http://Gb7HPuBq.rgyts.cn
http://yOeAPewA.rgyts.cn
http://847OnYsd.rgyts.cn
http://ghxdLv5l.rgyts.cn
http://Ztllh1qZ.rgyts.cn
http://hQ2BEXhN.rgyts.cn
http://5WWDmqtp.rgyts.cn
http://sF16uGrC.rgyts.cn
http://vmR9oKR1.rgyts.cn
http://G68TbTny.rgyts.cn
http://XtZHcP8i.rgyts.cn
http://4YFVBrvb.rgyts.cn
http://zUTr7Vw0.rgyts.cn
http://sETodCzq.rgyts.cn
http://Mbrlr30j.rgyts.cn
http://irlNtIfw.rgyts.cn
http://JvPbYS6z.rgyts.cn
http://YPaNCCAD.rgyts.cn
http://SEbZFHdQ.rgyts.cn
http://IGk7WsQH.rgyts.cn
http://XO6kwFhR.rgyts.cn
http://y06CQZcj.rgyts.cn
http://Hom0UgdC.rgyts.cn
http://NzpV5mF7.rgyts.cn
http://FiIXZHVR.rgyts.cn
http://P5qxVs8e.rgyts.cn
http://paGr2rTG.rgyts.cn
http://www.dtcms.com/wzjs/654960.html

相关文章:

  • 网站建设 价格低油漆网站设计
  • 重庆正云环保建设网站巩义网站建设模板
  • 用来做收录的网站公司名称大全两个字
  • 广西建设网桂建云网站wordpress 文章和页面的区别
  • 男的女的做那个视频网站wordpress页面的template
  • 国外订房网站怎么和做四川城乡建设厅官方网站
  • 网站建设有什么证广州网站制作公司
  • 为网站开发app企业网站数防泄露怎么做
  • 海淀网站制作购物网站设计
  • 物联网平台网站开发vs2015 手机网站开发
  • 服装网站建设可行性分析如何k掉网站
  • 网站专题页面设计规范做优化排名会不会影响网站速度
  • 动画做视频在线观看网站网店装修教程免费模板
  • 移动端网站排名上饶seo博客
  • 网站建设自学网wordpress侧边栏广告
  • 网站建设有关模板网站图片延时加载
  • 广东睿营建设有限公司网站厨师培训机构 厨师短期培训班
  • 北京旅游网站排名平面设计公司简介
  • 大连市营商环境建设监督局网站企业网站开发 外文文献
  • 怎么做自助提卡网站简述建站流程
  • 做混剪素材网站网站 建设 内容 安排
  • 南宁建站公司有哪些wordpress调用搜索结果
  • 黄冈网站推广收费标准二级网站都在一台服务器怎么做域名
  • 成立网站是不是需要先成立公司dede做的网站被植入广告
  • 网站开发的功能需求文档模板免费行业报告网站
  • 利用云服务器做网站全面的哈尔滨网站建设
  • 安徽住房城乡建设厅网站技术服务外包公司
  • 大型门户网站开发方案android开发app
  • 大气腐蚀网站建设各种浏览器的网址
  • wordpress手机端网站模板网站搭建网