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

C++ 智能指针简单介绍及用法

C++ 智能指针简单介绍及用法

智能指针是 C++11 引入的一个非常实用的特性,旨在自动管理动态分配的内存,避免内存泄漏和悬空指针问题。主要有三种类型的智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr。下面是对它们的详细介绍:

1. std::unique_ptr

  • 特性

    • 独占所有权:每个 std::unique_ptr 实例只能拥有一个对象的唯一所有权。
    • 不可复制:不能复制 unique_ptr,但可以移动(使用移动构造函数或移动赋值运算符)。
  • 使用场景:适用于表示唯一的拥有关系,不需要共享所有权的情况。

  • 示例

    #include <iostream>
    #include <memory>void uniquePtrExample() {std::unique_ptr<int> ptr1(new int(10)); // 创建 unique_ptrstd::cout << *ptr1 << std::endl;         // 使用指针std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移所有权// std::cout << *ptr1; // 错误:ptr1 已经不再拥有对象
    }
    

2. std::shared_ptr

  • 特性

    • 共享所有权:多个 std::shared_ptr 实例可以指向同一个对象。
    • 引用计数:通过引用计数来管理对象的生命周期,当最后一个 shared_ptr 被销毁时,内存会自动释放。
  • 使用场景:适用于多个对象共享同一资源的情况。

  • 示例

    #include <iostream>
    #include <memory>void sharedPtrExample() {std::shared_ptr<int> ptr1(new int(20)); // 创建 shared_ptr{std::shared_ptr<int> ptr2 = ptr1; // ptr2 也指向同一个对象std::cout << *ptr2 << std::endl;   // 输出 20} // ptr2 离开作用域后,引用计数减少std::cout << *ptr1 << std::endl;     // 仍然有效输出 20
    }
    

3. std::weak_ptr

  • 特性

    • 弱引用:提供对 shared_ptr 指向对象的非拥有性引用。
    • 不增加引用计数:不会影响对象的生命周期。
  • 使用场景:用于防止循环引用,或者在需要检查资源是否仍然有效时。

  • 示例

    #include <iostream>
    #include <memory>void weakPtrExample() {std::shared_ptr<int> sptr(new int(30));std::weak_ptr<int> wptr = sptr; // 创建 weak_ptrif (auto sptr2 = wptr.lock()) { // 检查 weak_ptr 是否有效std::cout << *sptr2 << std::endl; // 输出 30}sptr.reset(); // 删除 sptr 指向的对象if (auto sptr2 = wptr.lock()) {std::cout << *sptr2 << std::endl; // 输出为空,指向的对象已被释放} else {std::cout << "资源已被释放" << std::endl;}
    }
    

总结

利用智能指针可以帮助我们有效管理内存,降低内存泄漏的风险,提高程序的安全性和稳定性。🎉 选择合适的智能指针类型可以使代码更简洁和易于维护。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微调(二)
  • Java与Python谁更适合后端开发?
  • 计算机网络-七层协议栈介绍
  • Qt pdf文件操作
  • 学习记录day18——数据结构 算法
  • Hadoop学习(三)
  • AI PC处理器架-低功耗、NPU算力、大模型
  • Java面试题--多线程
  • Java基础总结
  • html+css+js前端作业英雄联盟首页1个页面带js
  • 测试面试宝典(四十一)—— 接口自动化的优缺点
  • 关闭窗口工具类 - C#小函数类推荐
  • C++四种类型转换
  • 【课程总结】day19(中):Transformer架构及注意力机制了解
  • 测试类型分类
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【347天】每日项目总结系列085(2018.01.18)
  • ES6 ...操作符
  • EventListener原理
  • git 常用命令
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • k8s 面向应用开发者的基础命令
  • Laravel 实践之路: 数据库迁移与数据填充
  • mysql外键的使用
  • npx命令介绍
  • sessionStorage和localStorage
  • vuex 笔记整理
  • 基于webpack 的 vue 多页架构
  • 模型微调
  • 深入浅出Node.js
  • 字符串匹配基础上
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)计算机毕业设计大学生兼职系统
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Scala的“=”符号简介
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET8使用VS2022打包Docker镜像
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Autowired和@Resource的区别
  • @EnableWebMvc介绍和使用详细demo
  • [ 蓝桥杯Web真题 ]-布局切换
  • [.net]官方水晶报表的使用以演示下载
  • [100天算法】-不同路径 III(day 73)