【cmu15445c++入门】(9)C++ 智能指针shared_ptr

一、智能指针shared_ptr

std::shared_ptr 是一种智能指针,它通过指针保留对象的共享所有权。这意味着多个共享指针可以拥有同一个对象,并且可以复制共享指针。

二、代码 


// In this file, we'll talk about std::shared_ptr, which is a C++ smart pointer.
// See the intro of unique_ptr.cpp for an introduction on smart pointers.
// std::shared_ptr is a type of smart pointer that retains shared ownership of
// an object through a pointer. This means that multiple shared pointers can
// own the same object, and shared pointers can be copied.//std::shared_ptr 是一种智能指针,它通过指针保留对象的共享所有权。
//这意味着多个共享指针可以拥有同一个对象,并且可以复制共享指针。// Includes std::cout (printing) for demo purposes.
#include <iostream>
// Includes std::shared_ptr functionality.
#include <memory>
// Includes the utility header for std::move.
#include <utility>// Basic point class. (Will use later)
class Point {
public:Point() : x_(0), y_(0) {}Point(int x, int y) : x_(x), y_(y) {}inline int GetX() { return x_; }inline int GetY() { return y_; }inline void SetX(int x) { x_ = x; }inline void SetY(int y) { y_ = y; }private:int x_;int y_;
};// Function that modifies a Point object inside a shared pointer
// by passing the shared pointer argument as a reference.
void modify_ptr_via_ref(std::shared_ptr<Point> &point) { point->SetX(15); }// Function that modifies a Point object inside a shared pointer
// by passing the shared pointer argument as a rvalue reference.
void modify_ptr_via_rvalue_ref(std::shared_ptr<Point> &&point) {point->SetY(645);
}void copy_shared_ptr_in_function(std::shared_ptr<Point> point) {std::cout << "Use count of shared pointer is " << point.use_count()<< std::endl;
}int main() {// This is how to initialize an empty shared pointer of type// 下面是几种智能指针的初始化方法// std::shared_ptr<Point>.std::shared_ptr<Point> s1;// This is how to initialize a shared pointer with the default constructor.std::shared_ptr<Point> s2 = std::make_shared<Point>();// This is how to initialize a shared pointer with a custom constructor.std::shared_ptr<Point> s3 = std::make_shared<Point>(2, 3);// The specific syntax for checking whether a smart pointer is empty is// covered in unique_ptr.cpp (line 56). Note that s1 is empty, while s2 and// s3 are not empty.std::cout << "Pointer s1 is " << (s1 ? "not empty" : "empty") << std::endl;std::cout << "Pointer s2 is " << (s2 ? "not empty" : "empty") << std::endl;std::cout << "Pointer s3 is " << (s3 ? "not empty" : "empty") << std::endl;// It is possible to copy shared pointers via their copy assignment and copy// constructor operators. Using these copy operators will increase the// reference count of the overall object. Also, std::shared_ptr comes with// a method called use_count which keeps track of the number of objects// currently interacting with the same internal data as the current shared// pointer instance.// 可以通过共享指针的复制赋值和复制构造函数运算符来复制共享指针。// 使用这些复制运算符将增加整个对象的引用计数。// 此外,std::shared_ptr 还附带了一个名为 use_count 的方法,该方法跟踪当前与当前共享指针实例相同的内部数据交互的对象数量。// First, the number of references to pointer s3 is obtained. This should be// 1 because s3 is the only object instance using the data in s3.// 初始时候,s3的引用计数为1std::cout<< "Number of shared pointer object instances using the data in s3: "<< s3.use_count() << std::endl;// Then, s4 is copy-constructed from s3.// This is copy-construction because it is the first time s4 appears.// 接着,s4也拷贝自s3,s3的引用计数为2。因为s3和s4都指向s3的数据std::shared_ptr<Point> s4 = s3;// Now, the number of references to pointer s3's data should be 2, since both// s4 and s3 have access to s3's data.std::cout << "Number of shared pointer object instances using the data in s3 ""after one copy: "<< s3.use_count() << std::endl;// Then, s5 is copy-constructed from s4.std::shared_ptr<Point> s5(s4);// Now, the number of references to pointer s3's data should be 3, since s5,// s4, and s3 have access to s3's data.// 接着,s5拷贝自s4,s3的引用计数为3。因为s3\s4\s5都指向s3的数据std::cout << "Number of shared pointer object instances using the data in s3 ""after two copies: "<< s3.use_count() << std::endl;// Modifying s3's data should also change the data in s4 and s5, since they// refer to the same object instance.// 修改s3的数据。s4\s5也会跟着一块变化s3->SetX(445);std::cout << "Printing x in s3: " << s3->GetX() << std::endl;std::cout << "Printing x in s4: " << s4->GetX() << std::endl;std::cout << "Printing x in s5: " << s5->GetX() << std::endl;// It is also possible to transfer ownership of a std::shared_ptr by moving// it. Note that the pointer is empty after the move has occurred.// 也可以通过move函数,来转让它的所有权。请注意,move发生后指针为空。std::shared_ptr<Point> s6 = std::move(s5);// Note that s5 is now empty, s6 refers to the same data as s3 and s4, and// there are still 3 shared pointer instances with access to the same Point// instance data, not 4.// move之后,s3\s4\s6都指向s3的数据,s5为空std::cout << "Pointer s5 is " << (s5 ? "not empty" : "empty") << std::endl;std::cout << "Number of shared pointer object instances using the data in s3 ""after two copies and a move: "<< s3.use_count() << std::endl;// Similar to unique pointers, shared pointers can also be passed by reference// and rvalue reference. See unique_ptr.cpp (line 89) for a information on// passing unique pointers by reference. See references.cpp for more// information on references. See move_semantics.cpp for more information on// rvalue references. Here, we present code below that calls functions that// modify s2 by passing a shared pointer as a reference and as a rvalue// reference.// 与unique_ptr指针类似,shared_ptr也可以通过引用和右值引用传递。// 有关参考文献的更多信息,请参阅references.cpp。有关右值引用的更多信息,请参阅move_semantics.cpp。// 在这里,我们在下面介绍代码,这些代码通过传递shared_ptr作为引用和右值引用来调用修改 s2 的函数。modify_ptr_via_ref(s2);modify_ptr_via_rvalue_ref(std::move(s2));// After running this code, s2 should have x = 15 and y = 645.std::cout << "Pointer s2 has x=" << s2->GetX() << " and y=" << s2->GetY()<< std::endl;// Unlike unique pointers, shared pointers can also be passed by value. In// this case, the function contains its own copy of a shared pointer, which// destroys itself after the function is finished. In this example, before s2// is passed to the function by value, its use count is 1. While it is in the// function, its use count is 2, because there is another copy of s2's data in// the shared pointer instance in the function. After the function goes out of// scope, this object in the function is destroyed, and the use count returns// to 1.// 与unique_ptr不同,shared_ptr也可以按值传递。在这种情况下,函数包含自己的共享指针副本,该指针在函数完成后会自行销毁。// 在此示例中,在 s2 按值传递给函数之前,其使用计数为 1。// 当它在函数中时,它的使用计数为 2,因为函数的共享指针实例中还有一个s2数据副本。// 函数结束后,函数中的此对象将被销毁,使用计数返回为 1。std::cout<< "Number of shared pointer object instances using the data in s2: "<< s2.use_count() << std::endl;copy_shared_ptr_in_function(s2);std::cout << "Number of shared pointer object instances using the data in s2 ""after calling copy_shared_ptr_in_function: "<< s2.use_count() << std::endl;return 0;
}

三、运行 

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

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

相关文章

氢氧化铝市场研究:预计2029年将达到15亿美元

近年来&#xff0c;随着全球工业和建筑业的快速发展&#xff0c;氢氧化铝的需求不断增加。特别是在汽车、航空航天、电子产品等行业中&#xff0c;氢氧化铝的应用越来越广泛。此外&#xff0c;环境意识的提升也推动了氢氧化铝市场的增长&#xff0c;因为其可回收再利用的特性符…

【C++】C++11中

C11中 1.lambda表达式2.可变参数模板3.包装器 1.lambda表达式 在前面我们学习过仿函数。仿函数的作用到底是干什么的呢&#xff1f; 它为了抛弃函数指针&#xff01; 主要是因为函数指针太难学了 就比如下面这个&#xff0c;看着也挺难受的。 它的参数是一个函数指针&#x…

使用XTuner微调书生·浦语2大模型实战

一、XTuner安装 1、代码准备 mkdir project cd project git clone https://github.com/InternLM/xtuner.git 2、环境准备 cd xtuner pip install -r requirements.txt #从源码安装 pip install -e .[all] 3、查看配置文件列表 XTuner 提供多个开箱即用的配置文件&#xf…

2月19日

ApplicationContextInitializer SpringBoot 框架在设计之初&#xff0c;为了有更好的兼容性&#xff0c;在不同的运行阶段&#xff0c;提供了非常多的可扩展点&#xff0c;可以让程序员根据自己的需求&#xff0c;在整个Spring应用程序运行过程中执行程序员自定义的代码Applic…

【深蓝学院】移动机器人运动规划--第5章 最优轨迹生成--笔记

文章目录 1. Preliminaries2. Multicopter dynamics and differential flatness&#xff08;多旋翼动力学和微分平坦特性&#xff09;2.1 Differential Flatness2.2 具体建模2.3 Flatness Transformation的解析推导 3. Trajectory Optimization轨迹优化3.1 Problem formulation…

C++学习Day06之继承中的同名成员处理

目录 一、程序及输出1.1 同名成员变量1.2 同名成员函数 二、分析与总结 一、程序及输出 1.1 同名成员变量 #include<iostream> using namespace std;class Base { public:Base(){this->m_A 10;}void func(){cout << "Base中的func调用" << e…

“利用电子医院记录,针对急性护理环境中的老年人,开发并验证了一项医院脆弱风险评分:一项观察性研究“

总结 背景 年长者在全球范围内成为医疗保健的增长用户。我们的目标是确定是否可以利用常规收集的数据来识别具有虚弱特征并面临不利健康结果风险的年长者。 方法 使用三步方法开发和验证了一种医院脆弱风险评分&#xff0c;该评分基于《国际疾病和相关健康问题统计分类第十次修…

Milvus向量库安装部署

GitHub - milvus-io/milvus-sdk-java: Java SDK for Milvus. 1、安装Standstone 版本 参考&#xff1a;Linux之milvus向量数据库安装_milvus安装-CSDN博客 参考&#xff1a;Install Milvus Standalone with Docker Milvus documentation 一、安装步骤 1、安装docker docke…

使用八爪鱼爬取京东商品详情页数据

文章目录 一、前述1.1、采集场景1.2、采集字段1.3、采集结果1.4、采集工具 二、采集步骤2.1、登录网站2.1.1、登录入口2.1.2、京东账号登录2.1.3、登录完成 2.2、自动识别2.3、选取爬取的内容2.4、处理数据2.4.1、纵向字段布局2.4.2、更多字段操作2.4.3、格式化数据2.4.4、添加…

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora&#xff1f;3. Sora的技术原理 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感…

【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 动态规划汇总 LeetCode1866. 恰有 K 根木棍可以看到的排列数目 有 n 根长度互不相同的木棍&#xff0c;长度为从 1 到 n 的整数。请你将这些木棍排成一排&#xff0c;并满足从左侧 可以…

Yii2项目使用composer异常记录

问题描述 在yii2项目中&#xff0c;使用require命令安装依赖时&#xff0c;出现如下错误提示 该提示意思是&#xff1a;composer运行时&#xff0c;执行了yiisoft/yii2-composer目录下的插件&#xff0c;但是该插件使用的API版本是1.0&#xff0c;但是当前的cmposer版本提供的…

Jmeter的自动化测试实施方案(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter是目前最流行的一种测试工具&#xff0c;基于此工…

Pdoc:生成优雅Python API文档的工具

Pdoc&#xff1a;生成优雅Python API文档的工具 在开发Python项目时&#xff0c;文档是至关重要的。它不仅提供了对代码功能和用法的了解&#xff0c;还为其他开发人员提供了参考和使用的便利。Pdoc是一个流行的文档生成工具&#xff0c;专为生成Python API文档而设计。本文将介…

扯淡的DevOps,我们开发根本不想做运维!

引言 最初考虑引用“ DevOps 已死&#xff0c;平台工程才是未来”作为标题&#xff0c;但这样的表达可能太过于绝对。最终&#xff0c;决定用了“扯淡的”这个词来描述 DevOps&#xff0c;但这并不是一种文明的表达方式。 文章旨在重新审视 DevOps 和平台工程&#xff0c;将分别…

【c语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

什么台灯最好学生晚上用的?五大高口碑学生护眼台灯推荐

对于学生来说&#xff0c;晚上学习早已是家常便饭&#xff0c;其中如果光线不合适&#xff0c;很容易就会造成近视的情况。面对这样的商机&#xff0c;很多厂家纷纷涉足护眼台灯行业&#xff0c;无论技术成熟与否&#xff0c;都大打护眼卖点&#xff0c;其中难免含有大量水分。…

SpringMVC的执行流程

过去的开发中,视图阶段&#xff08;老旧JSP等&#xff09; 1.首先用户发送请求到前端控制器DispatcherServlet(这是一个调度中心) 2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping 3.处理器映射器HandlerMapping找到具体的处理器,可查找xml配置或注…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

网络原理 - HTTP/HTTPS(2)

HTTP请求 认识URL URL基本格式 平时我们俗称的"网址"其实就是说的URL(Uniform Resource Locator统一资源定位符). (还有一个唯一资源标识符,称为uri,严格来说,uri范围比url广). 互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该…