智能指针三剑客:shared_ptr的使用

目录

shared_ptr错误范例

其他补充

尺寸问题

移动语义


shared_ptr错误范例

裸指针:

#include<iostream>
using namespace std;
void Test(shared_ptr<int> ps)
{return;
}
int main()
{int *p=new int(666);Test(p);
//E0415	不存在从 "int *" 转换到 "std::shared_ptr<int>" 的适当构造函数	
//shared_ptr是禁止隐式类型转换的,有explicit属性Test(shared_ptr<int>(p));//临时shared_ptr对象*p=555;
//系统不报错,但是我们使用了已经被释放的内存。p在Test结束时就已经被智能指针释放。shared_ptr<int> pi1(p);shared_ptr<int> pi2(p);
//编译时报错,这样用裸指针初始化多个shared_ptr对象,pi1与pi2的引用计数并不关联。导致系统报错}
//裸指针和智能指针混用会带来很多不引人注意的问题。如果使用裸指针给智能指针初始化,就不要再使用该裸指
//针了。更不要使用裸指针给多个shared_ptr对象初始化

get(): 

#include<iostream>
using namespace std;
int main()
{shared_ptr<int> ps(new int(666));int *p=ps.get();//这样获得的裸指针不要再delete。shared_ptr<int> ps2(p);
//这样也会导致ps与ps2的引用计数不相关联,系统异常。
}
//不要用get()得到的裸指针初始化shared_ptr对象

 将this指针作为shared_ptr对象返回:

#include<iostream>
using namespace std;
class CT
{
public:shared_ptr<CT> getself(){return shared_ptr<CT>(this);}
}
int main()
{shared_ptr<CT> ps1(new CT);shared_ptr<CT> ps2=ps1->getself();
//这样同样导致ps1与ps2的引用计数不关联,导致异常
//这时我们可以使CTpublic继承enable_shared_from_this(c++标准库中的模板类),
//再使用return enable_shared_from_this;代替return shared_ptr<CT>(this);
//就可以保证代码的正确了(其实是使用了weak_ptr的lock()功能)
}

 循环引用:

#include<iostream>
using namespace std;
class A
{
public:shared_Ptr<B> pb;~A() {}
};
class B
{
public:shared_ptr<A> pa;~B() {}
};
int main()
{shared_ptr<A> mpa(new A);shared_ptr<B> mpb(new B);mpa->pb=mpb;mpb->pa=mpa;
}//这样会造成死锁问题。mpa和mpb的析构函数都不会被释放,造成内存泄露。
//解决方案是将类中任意一个shared_ptr改为weak_ptr。

其他补充

尺寸问题

shared_ptr与weak_ptr对象占用的内存都是裸指针的两倍。例如shared_ptr是int *的两倍,也就是8字节。在这两倍的内存中,实际上包含两个裸指针。一个指向我们需要的对象,另一个指向控制块,控制块中包含着一些需要记录的内容,如强引用计数,弱引用计数,自定义的删除器,分配器等。当我们生成第一个指向某对象的shared_ptr对象时,控制块就会同时被分配出来。当我们用shared_ptr对象生成weak_ptr对象时,weak_ptr对象中的指针就会指向shared_ptr指向的对象,另一个指向该 shared_ptr对象指向的控制块,就是说,指向同一个对象的shared_ptr对象和weak_ptr对象指向同一个控制块。这也说明了weak_ptr的生成要依赖shared_ptr对象的原因,因为weak_ptr对象并不能自主生成控制块,必须提供shared_ptr对象给出供它指向的控制块。

移动语义

shared_ptr<int> p1=make_shared<int>(666);
shared_ptr<int> p2(std::move(p1));
//引用计数依旧为1,p1变为空

相比拷贝构造函数,移动构造函数的速度更快,且不增加引用计数。

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

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

相关文章

免费开源线上线下交友社交圈子系统 小程序+APP+H5 可支持二开!

为什么要玩社交软件&#xff1a;互联网社交软件的独特优势 首先&#xff0c;社交软件为我们提供了一个便捷的沟通方式。在传统的交往方式中&#xff0c;人们需要面对面交流&#xff0c;这种方式在时间和空间上都受到限制。而社交软件打破了这些限制&#xff0c;无论我们身处何地…

既能自动仿写公众号爆文,还能批量帮你上架闲鱼商品,打造自己的数字员工,简直yyds

「想象一下&#xff0c;如果有一个机器人在你的计算机上24小时不间断地工作&#xff0c;会不会做梦都笑着」 一、RPA机器人是什么&#xff1f; RPA——机器人流程自动化&#xff0c;它可以帮助人们完成重复性的、繁琐的工作&#xff0c;比如数据输入、网页爬取、自动化流程等…

llama3 史上最强开源大模型,赶超GTP-4,逼宫OpenAI

2024年4月18日&#xff0c;Meta公司推出了开源大语言模型Llama系列的最新产品—Llama 3&#xff0c;包含了80亿参数的Llama 3 8B和700亿参数的Llama 3 70B两个版本。Meta称其为“迄今为止最强的开源大模型”。 怪兽级性能 LLaMA3 提供了不同参数规模的版本&#xff0c;以适应…

你真的知道Show Master Status吗?

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 你真的知道Show Master Status吗&#xff1f; 前言输出字段展示file详解Position详解Binlog_Do_DBBinlog_Ignore_DBExecuted_Gtid_Set 前言 在数据库的世界里&#xff0c;每一个字段都像是一个谜团&a…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

Verilog中求两个数的差值

根据输入信号a,b的大小关系&#xff0c;求解两个数的差值&#xff1a;输入信号a,b为8bit位宽的无符号数。如果a>b&#xff0c;则输出a-b&#xff0c;如果a≤b&#xff0c;则输出b-a。 接口信号图如下&#xff1a; 代码如下&#xff1a; &#xff08;CSDN代码块不支持Veril…

WPF之绑定属性值转换

1&#xff0c;使用Binding.Format属性简易设置绑定的属性数据显示格式。 <TextBox Grid.Row"2" Grid.Column"1"><TextBox.Text><Binding Path"UnitCost" StringFormat"{}{0:C3}" > …

加州大学欧文分校英语中级语法专项课程02:Adjectives and Adjective Clauses 学习笔记

Adjectives and Adjective Clauses course certificate 本文是 https://www.coursera.org/learn/adjective-clauses 这门课的学习笔记。 文章目录 Adjectives and Adjective ClausesWeek 01: Adjectives and Adjective PhrasesLearning Objectives Adjectives Introduction Le…

Vue学习:21.mixins混入

在Vue中&#xff0c;mixins&#xff08;混入&#xff09;是一种用于分发Vue组件中可复用功能的灵活机制。它们允许你抽取组件中的共享功能&#xff0c;如数据、计算属性、方法、生命周期钩子等&#xff0c;并将其作为单独的模块复用到多个组件中。这种方式有助于保持代码的DRY&…

一个新细节,Go 1.17 将允许切片转换为数组指针!

在 Go 语言中&#xff0c;一个切片&#xff08;slice&#xff09;包含了对其支持数组的引用&#xff0c;无论这个数组是作为一个独立的变量存在于某个地方&#xff0c;还是仅仅是一个为支持分片而分配的匿名数组。 其切片基本结构都如下&#xff1a; // runtime/slice.go typ…

ChatGPT 4.0 直接用 !!!Code Copilot编程大模型、DALL-E AI绘图、绘制流程图、上传文件

嗨&#xff0c;你好呀&#xff0c;我是哪吒。 这一年最让人揪心的热点&#xff0c;就是各种层出不穷的AI技术。 原以为它只是短暂霸屏&#xff0c;但现实却赤裸裸展示了&#xff0c;什么叫AI抢走你的饭碗&#xff0c;连招呼都不打一声! 什么策划方案、公众号文案、营销卖点、…

学术咸鱼入门指南(1)

学术基础素养 一.巧用工具管理文献&#xff0c;形成自己的文献体系 养成习惯的第一步&#xff1a;文献命名 当你下载完一篇文献&#xff0c;应该做的第一步就是给文献重新命名。命名的逻辑可以随自己的喜好来&#xff0c;可以按照“发表年份作者文章标题”。 也可以使用文献…

ERROR - connection_lost: StreamLostError: (‘Transport indicated EOF‘,)

目录 python rabbitmq发送消息报错 网上的答案 heartbeat 重连效果不好 我的解决方法 亲测ok

JavaScript-DOM简介

JavaScript-DOM简介 之前我们说过JavaScript有三部分组成ECMAscript,BOM,DOM,之前我们都在了解JavaScript的语法即ECMAScript&#xff0c; 今天我们开始了解DOM(文档对象模型&#xff08;Document object Model&#xff09;&#xff0c;操作网页上的元素的API&#xff09; 什…

利用策略模式+模板方法实现项目中运维功能

前段时间项目中有个需求&#xff1a;实现某业务的运维功能&#xff0c;主要是对10张数据库表的增删改查&#xff0c;没有复杂的业务逻辑&#xff0c;只是满足运维人员的基本需要&#xff0c;方便他们快速分析定位问题。这里简单记录分享下实现方案&#xff0c;仅供参考。 一、…

企业遗失风景园林设计乙级资质证书要怎么补办

如果企业遗失了风景园林设计乙级资质证书&#xff0c;补办的基本流程可参考以下步骤&#xff0c;但请注意&#xff0c;实际操作应以所在地住房和城乡建设行政主管部门的最新要求为准&#xff0c;以下是一般流程&#xff1a; 遗失声明&#xff1a; 通常需要在省级以上公开发行的…

多模态路径:利用其他模态的无关数据改进变压器(CVPR 2024)

<Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities> 论文地址&#xff1a;https://arxiv.org/abs/2401.14405 项目网页&#xff1a;https://ailab-cvc.github.io/M2PT/ 开源代码&#xff1a;https://github.com/AILab-CVC/M2PT 讲…

vue快速入门(五十七) 作用域插槽

注释很详细&#xff0c;直接上代码 上一篇 新增内容 作用域插槽实现表格删除数据 源码 App.vue <template><div id"app"><!-- 向子组件传值 --><MyTable :tableData"tableData"><!-- 接收子组件的传值&#xff0c;默认是对象格…

Verilog学习之时序控制、语句块(1)

推荐Verilog学习网址&#xff1a; HDLbits EDAPlayground 菜鸟教程 因为自己以前学过Verilog&#xff0c;现在要重新捡起来&#xff0c;所以就记录了一下不熟悉的部分。 时序控制 代码来自菜鸟教程4.3 Verilog 时序控制 | 菜鸟教程 1.时延控制 常规时延 #10 value1 v…

Web3 ETF的基本概念

Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;是一种投资工具&#xff0c;它允许投资者通过购买单一的基金份额来获得对多个与Web3技术相关的公司和资产的曝光。Web3技术通常指的是基于区块链构建的去中心化网络和应用&#xff0c;包括加密…