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

C++:智能指针了解

介绍

C++ 中的智能指针是一种用于自动管理动态分配的内存的类模板。它们可以帮助程序员避免内存泄漏和悬挂指针等问题。C++11 引入了三种主要的智能指针:
std::unique_ptr、
std::shared_ptr 和
std::weak_ptr。每种智能指针都有其特定的用途和优势。

std::unique_ptr

std::unique_ptr 表示对对象的独占所有权。在同一时间内,只能有一个 std::unique_ptr 指向一个给定的对象。当 std::unique_ptr 被销毁时(例如,离开作用域时),它所指向的对象也会被自动删除。

#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  void sayHello() { std::cout << "Hello, World!\n"; }  
};  int main() {  std::unique_ptr<MyClass> ptr(new MyClass());  ptr->sayHello(); // 使用智能指针调用成员函数  // ptr 被销毁时,MyClass 对象也会被自动删除  // 无需手动调用 delete  return 0;  
}

std::shared_ptr

std::shared_ptr 表示对对象的共享所有权。多个 std::shared_ptr 实例可以指向同一个对象,且只有当最后一个指向该对象的 std::shared_ptr 被销毁时,对象才会被删除。这通过内部使用引用计数实现。

#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  void sayHello() { std::cout << "Hello, World!\n"; }  
};  int main() {  std::shared_ptr<MyClass> ptr1(new MyClass());  std::shared_ptr<MyClass> ptr2 = ptr1; // ptr1 和 ptr2 共享所有权  ptr1->sayHello();  // 当 ptr1 和 ptr2 都被销毁时,MyClass 对象才会被删除  return 0;  
}

std::weak_ptr

std::weak_ptr 是一种不拥有其所管理对象的智能指针。它主要用于解决 std::shared_ptr 之间的循环引用问题。std::weak_ptr 可以被转换为std::shared_ptr,但这会临时增加对象的引用计数,如果引用计数为 0,则对象会被删除,返回的 std::shared_ptr 将为空。通常与 std::shared_ptr 一起使用)

#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  
};  int main() {  std::shared_ptr<MyClass> ptr1(new MyClass());  std::weak_ptr<MyClass> ptr2 = ptr1;  // 使用 ptr2 时,需要将其转换为 shared_ptr  if (std::shared_ptr<MyClass> ptr3 = ptr2.lock()) {  // 如果 ptr2 指向的对象存在,则 ptr3 非空  // ...  }  // 当 ptr1 被销毁时,MyClass 对象也会被删除  // ptr2 不阻止对象的删除  return 0;  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis 实现消息队列
  • 拥抱变革:旗晟智能巡检机器人系统重塑高风险行业巡检模式
  • 【算法刷题】合并两个有序链表、获取链表的中间节点、反转链表
  • 【面试经验】24届前端校招 字节、阿里、美团、快手、腾讯面试经验汇总
  • 【扒代码】图像数据 Transformer
  • Eclipse插件之Java Dependency Viewer(显示类和包的关系图)
  • 日志Log程序(C++)
  • 深度学习每周学习总结N6:使用Word2vec实现文本分类
  • Spring Cloud全解析:注册中心之zookeeper注册中心
  • 4.MySQL数据类型
  • 2023华为od机试C卷【围棋的气】python实现
  • 哈萨克语驾考学习软件求推荐?
  • Springboot项目基础开发模式+注解
  • 【香橙派系列教程】(十三) 香橙派的摄像头接入
  • 【Pyspark-驯化】一文搞懂Pyspark修改hive表描述以及增加列使用技巧
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2017年终总结、随想
  • AWS实战 - 利用IAM对S3做访问控制
  • Gradle 5.0 正式版发布
  • LeetCode29.两数相除 JavaScript
  • PHP变量
  • React-Native - 收藏集 - 掘金
  • spring security oauth2 password授权模式
  • Theano - 导数
  • Unix命令
  • ViewService——一种保证客户端与服务端同步的方法
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 我的面试准备过程--容器(更新中)
  • 阿里云重庆大学大数据训练营落地分享
  • ​【已解决】npm install​卡主不动的情况
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (23)Linux的软硬连接
  • (C语言)fread与fwrite详解
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 的字符串暂存池
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET开发者必备的11款免费工具
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /*在DataTable中更新、删除数据*/
  • :not(:first-child)和:not(:last-child)的用法
  • @font-face 用字体画图标
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @RunWith注解作用
  • [ACTF2020 新生赛]Upload 1
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [AX]AX2012 SSRS报表Drill through action
  • [bzoj 3534][Sdoi2014] 重建
  • [C#学习笔记]Newtonsoft.Json