当前位置: 首页 > 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;}
    }
    

总结

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

http://www.lryc.cn/news/413746.html

相关文章:

  • k8s笔记之创建Istio Gateway规则
  • NAND行业回归盈利:AI与云存储需求驱动
  • 【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】
  • 从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架
  • 学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)
  • JS原型链
  • 《Java初阶数据结构》----5.<二叉树的概念及使用>
  • git查看记录详解
  • 检索增强生成RAG系列10--RAG的实际案例
  • 程序员自我提升的全面指南
  • 【golang】Golang手写元组 tuple | golang tuple
  • golang中struct的tag -简记
  • 分布式领域扩展点设计稿
  • 玩转微信公众号变现:从新手到专家的全攻略
  • JVM: 方法调用
  • 测试面试宝典(四十一)—— 接口自动化的优缺点
  • “火炬科企对接”先进计算产业推进会 | 麒麟信安受邀参加,并签署开源生态合作协议
  • 中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题
  • 图欧学习资源网创站以来的更新日志(截止至2022.5.6)不完全统计
  • 现代前端架构介绍(第二部分):如何将功能架构分为三层
  • LeetCode Easy|【21. 合并两个有序链表】
  • 大模型的架构参数是指定义模型基本结构和组成的各种参数,这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍
  • 人工智能会越来越闭源——对话东北大学副教授王言治 | Open AGI Forum
  • 【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。
  • 三十种未授权访问漏洞合集
  • 【Golang 面试 - 进阶题】每日 3 题(十五)
  • Java中实现文件上传
  • 一种别样的Unicode Python编码方式,完美转换表情和阿拉伯语
  • 小白的晋升之路
  • WebLogic:CVE-2017-10271[XML反序列化]