了解c++智能指针的使用案例和场景

c++智能指针是一种封装了原始指针的类对象,可以实现自动管理内存的功能,避免手动new和delete造成的内存泄漏或重复释放等问题。

c++智能指针有三种类型,分别是:

  • std::unique_ptr:独占式智能指针,表示对内存的唯一所有权,不能被拷贝或赋值,只能通过移动语义转移所有权。适用于需要确保内存只有一个拥有者的场景,例如函数返回值、局部变量、类成员等。
  • std::shared_ptr:共享式智能指针,表示对内存的共享所有权,可以被拷贝或赋值,内部使用引用计数来记录内存的使用情况,当引用计数为零时,自动释放内存。适用于需要多个拥有者共同使用内存的场景,例如容器、动态数组、链表等。
  • std::weak_ptr:弱式智能指针,表示对内存的非拥有性引用,不能直接访问内存,只能通过lock()方法获得一个std::shared_ptr来访问内存,不影响引用计数。适用于需要观察或监视内存的场景,例如解决循环引用的问题、缓存数据等。

下面是一些c++智能指针的使用案例和场景的示例代码:

// 使用std::unique_ptr作为函数返回值,避免裸指针的内存泄漏
std::unique_ptr<int> create_int(int value) {return std::make_unique<int>(value); // 使用make_unique创建一个std::unique_ptr
}void use_int() {auto p = create_int(42); // 使用auto接收返回值,避免写出冗长的类型名std::cout << *p << std::endl; // 使用*解引用访问内存// 函数结束时,p自动析构,释放内存
}// 使用std::shared_ptr作为类成员,实现多个对象共享同一块内存
class Person {
private:std::string name_;int age_;std::shared_ptr<Person> friend_; // 使用std::shared_ptr作为类成员,表示与另一个Person对象共享内存
public:Person(const std::string& name, int age) : name_(name), age_(age) {}void make_friend(const std::shared_ptr<Person>& p) {friend_ = p; // 拷贝赋值,增加引用计数}void show_info() const {std::cout << "name: " << name_ << ", age: " << age_ << std::endl;if (friend_) {std::cout << "friend: " << friend_->name_ << std::endl;}}~Person() {std::cout << name_ << " is destructed" << std::endl;}
};void use_person() {auto alice = std::make_shared<Person>("Alice", 20); // 使用make_shared创建一个std::shared_ptrauto bob = std::make_shared<Person>("Bob", 21);alice->make_friend(bob); // Alice和Bob成为朋友,共享内存bob->make_friend(alice);alice->show_info();bob->show_info();// 函数结束时,alice和bob自动析构,引用计数减一,当引用计数为零时,释放内存
}


// 使用std::weak_ptr解决循环引用的问题

class Node {
private:int value_;std::shared_ptr<Node> next_; // 使用std::shared_ptr表示下一个节点的指针std::weak_ptr<Node> prev_; // 使用std::weak_ptr表示前一个节点的指针,避免循环引用
public:Node(int value) : value_(value) {}void set_next(const std::shared_ptr<Node>& next) {next_ = next;next->prev_ = std::weak_ptr<Node>(shared_from_this()); // 使用shared_from_this()获得当前对象的std::shared_ptr,然后转换为std::weak_ptr赋值给next的prev_}void show_info() const {std::cout << "value: " << value_ << std::endl;if (next_) {std::cout << "next: " << next_->value_ << std::endl;}if (auto p = prev_.lock()) { // 使用lock()方法获得一个std::shared_ptr,如果内存还存在,则可以访问,否则返回空指针std::cout << "prev: " << p->value_ << std::endl;}}~Node() {std::cout << value_ << " is destructed" << std::endl;}
};void use_node() {auto head = std::make_shared<Node>(1); // 创建一个头节点auto tail = std::make_shared<Node>(2); // 创建一个尾节点head->set_next(tail); // 设置头节点的下一个节点为尾节点,尾节点的前一个节点为头节点head->show_info();tail->show_info();// 函数结束时,head和tail自动析构,由于使用了std::weak_ptr,没有循环引用,内存可以正常释放
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YAPI接口自动鉴权功能部署详解

安装准备 以下操作&#xff0c;默认要求自己部署过yapi&#xff0c;最好是部署过yapi二次开发环境。 无论是选择在线安装或者是本地安装&#xff0c;都需要安装client工具。 1、yapi-cli&#xff1a;npm install yapi-cli –g&#xff0c; 2、安装后将文件夹nodejs/node_gl…

Chapter 8 - 16. Congestion Management in TCP Storage Networks

Active Queue Management As previously mentioned, dropping or marking schemes for packets that are waiting in a queue can significantly influence TCP’s behavior on the end devices. These schemes are called Active Queue Management (AQM). 如前所述,针对在队…

推荐一个内网穿透工具,支持Windows桌面、Linux、Arm平台客户端

神卓互联是一款常用的内网穿透工具&#xff0c;它可以将本地服务器映射到公网上&#xff0c;并提供域名或子域名给外部访问。神卓互联具有简单易用、高速稳定的特点&#xff0c;支持Windows桌面版、Linux版、Arm版客户端&#xff0c;以及硬件等。 神卓互联内网穿透技术简介 企…

【C++航海王:追寻罗杰的编程之路】vector

目录 1 -> vector的介绍及使用 1.1 -> vector的介绍 1.2 -> vector的使用 1.2.1 -> vector的介绍 1.2.2 -> vector iterator的使用 1.2.3 -> vector空间增长问题 1.2.4 -> vector的增删查改 1.2.5 -> vector迭代器失效问题 2 -> vector的深…

uniapp登录逻辑

1.登录页面实现 <template><view class"box"><view class"boxTop"><view class"title">欢迎登录</view><view class"topic">还没有账号&#xff0c;<span clickgetRegister>立即注册</…

已解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

今天在使用 IDEA 使用 MyBatis 的时候遇到了这种情况&#xff1a; 可以看到 userMapper 下有个红色的波浪警告&#xff0c;虽然代码没有任何问题&#xff0c;能正常运行&#xff0c;但是这个红色警告在这里杵着确实让人很窝心。 于是我在网上找了找&#xff0c;最终明白了原因…

[杂记]mmdetection3.x中的数据流与基本流程详解(数据集读取, 数据增强, 训练)

之前跑了一下mmdetection 3.x自带的一些算法, 但是具体的代码细节总是看了就忘, 所以想做一些笔记, 方便初学者参考. 其实比较不能忍的是, 官网的文档还是空的… 这次想写其中的数据流是如何运作的, 包括从读取数据集的样本与真值, 到数据增强, 再到模型的forward当中. 0. MMDe…

AcuAutomate:一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具

关于AcuAutomate AcuAutomate是一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具&#xff0c;该工具旨在辅助研究人员执行大规模的渗透测试任务。 在大规模的安全测试活动中&#xff0c;AcuAutomate可以帮助我们同时启动或停止多个Acunetix扫描任务。除此之外&#xff…

docker的底层原理五: 控制组

概述&#xff1a;Docker 的控制组&#xff08;Control groups&#xff0c;简称 cgroups&#xff09;是 Linux 内核的一个功能&#xff0c;用于限制、控制和审计进程组所使用的物理资源。在 Docker 中&#xff0c;cgroups 用于确保容器只能使用分配给它们的资源&#xff0c;从而…

你知道Web框架有哪些吗?

Bootstrap Bootstrap 是由Twitter团队推出的开源前端框架&#xff0c;以HTML、CSS和JavaScript为基础&#xff0c;提供了一系列可复用的UI组件和强大的响应式布局系统。它易于上手&#xff0c;有助于开发者快速构建简洁、一致且移动友好的网站。 Foundation Foundation 同样是…

【鸿蒙系统学习笔记】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

【工作记录】基于docker+mysql部署单机版nacos2.0.4@20240219

Nacos介绍 Nacos 是阿里巴巴开源的一款集服务发现、配置管理和服务元数据管理于一身的中间件&#xff0c;主要用于构建云原生应用和微服务架构。Nacos 提供了一站式的解决方案&#xff0c;使得开发者能够更容易地实现服务治理和服务间的协作。 以下是 Nacos 主要功能特点&…

[AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

首先你必须有巨魔才能使用&#xff01;&#xff01; 不会安装的&#xff0c;还没安装的移步这里&#xff0c;ios17 以上目前装不了&#xff0c;别看了&#xff1a;永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯 视频教程 【Audio…

头歌:共享单车之数据分析

第1关 统计共享单车每天的平均使用时间 package com.educoder.bigData.sharedbicycle;import java.io.IOException; import java.text.ParseException; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java…

科技云报道:云原生是大模型“降本增效”的解药吗?

科技云报道原创。 在过去一两年里&#xff0c;以GPT和Diffusion model为代表的大语言模型和生成式AI&#xff0c;将人们对AI的期待推向了一个新高峰&#xff0c;并吸引了千行百业尝试在业务中利用大模型。 国内各家大厂在大模型领域展开了激烈的军备竞赛&#xff0c;如&#…

HTTP 头部- Origin Referer

Origin & Referer Origin Header 示例 Origin 请求头部是一个 HTTP 头部&#xff0c;它提供了发起请求的网页的源&#xff08;协议、域名和端口&#xff09;信息。它通常在进行跨域资源共享&#xff08;CORS&#xff09;请求时使用&#xff0c;以便服务器可以决定是否接受…

Python set函数

在Python编程中&#xff0c;set()函数是一个重要且常用的内置函数&#xff0c;用于创建一个新的集合对象。集合是一种无序且不重复的数据类型&#xff0c;它可以用于存储唯一的元素。本文将深入探讨Python中的set()函数&#xff0c;包括基本用法、集合操作、实际应用场景&#…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Vue过滤器原理

Vue过滤器 什么是Vue过滤器定义Vue过滤器 组件的选项中定义本地的过滤器或者在创建 Vue 实例之前全局定义过滤器单个器原理串联过滤器过滤器参数接收 _f函数的原理 过滤器解析原理 总结&#xff1a; vue 过滤器原理 Vue过滤器 过滤器实质不改变原始数据&#xff0c;只是对数据…

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图 参考论文: 高效连续型射频功率放大器研究 假期就要倒计时啦&#xff0c;估计是寒假假期的最后一个博客&#xff0c;希望各位龙年工作顺利&#xff0c;学业有成。 全部工程下载&#xff1a;基于数字双输入的超宽…