shared_ptr的概念和一些特性调查

news/2024/11/19 21:38:06/文章来源:https://www.cnblogs.com/hy227/p/18197541

shared_ptr

概念

shared_ptr 是 C++11 中引入的一种智能指针,用于自动管理资源,特别是动态分配的内存。它属于 头文件中定义的智能指针类之一,用于解决动态内存分配中的内存泄漏和资源生命周期管理问题。shared_ptr 通过引用计数机制来实现多个 shared_ptr 实例共享同一资源。

具有较好的安全性,可以避免内存泄漏和悬挂指针问题。

特性

线程安全的说明

shared_ptr 自身的引用计数是线程安全的,但指向的对象本身不是线程安全的。如果多个线程需要访问同一对象,需要额外的同步机制。

二进制兼容性

如果客户代码里有 new Bar,那么肯定不安全,因为 new 的字节数不够装下新 Bar。相反,如果 library 通过 factory 返回 Bar* (并通过 factory 来销毁对象)或者直接返回 shared_ptr,客户端不需要用到 sizeof(Bar),那么可能是安全的。
即把创建交给动态库,而不是由客户自己创建。

陈硕博客

一个有趣的问题

#include <iostream>
#include <memory>class base
{
public:base(){std::cout << "base constructor" << std::endl;}~base(){std::cout << "base destructor" << std::endl;}
};class test: public base
{
public:test(): base(){std::cout << "test constructor" << std::endl;}~test(){std::cout << "test destructor" << std::endl;}
};int main()
{std::cout << "test shared_ptr------------" << std::endl;{std::shared_ptr<base> ptr(new test);}std::cout << "test unique_ptr------------" << std::endl;{std::unique_ptr<base> ptr(new test);}return 0; // success
}

输出结果是:

test shared_ptr------------
base constructor
test constructor
test destructor
base destructor
test unique_ptr------------
base constructor
test constructor
base destructor

可以发现shared_ptr可以在析构时自动释放资源没有设置基类为虚析构函数的基类,而unique_ptr不行。

查阅源码调查原因发现:
shared_ptr中,会判断是否存在基类
并且创建一个指向基类的指针:
mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
alt text

当析构的时候会一并调用_M_weak_this的析构函数,也就是基类的析构函数.

shared_ptr能实现这一点主要在于:
shard_ptr构造的时候,会去判断指针的类型,并结合shared_ptr的模板参数
alt text

unique_ptr之所以实现不了这种特性,是因为unique_ptr默认采用的是default_delete,而default_delete的模板参数是由unique_ptr的模板参数决定的。所以导致其不能实现。
alt text

但unique_ptr的优点就是可以灵活的更换delete函数。

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

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

相关文章

SIEM

背景和介绍 SIEM(Security Information and Event Management,简称SIEM)安全信息和事件管理,最初是被设计为一个工具,辅助企业实现合规和特定行业的规定。从时间维度上讲,SIEM是已经存活了近20年的技术。 其结合安全信息管理(security information management, SIM)和安…

七牛云文件批量上传加单个上传和下载

第一步: 先在七牛云官网注册一个账号 然后点击对象存储-空间管理-新建空间 创建一个存储空间创建好之后就完成了第一步 可以往里面放东西了 第二步: 打开你的VS 创建一个类 改成静态类 方便外部调用 写一个静态的方法/// <summary>/// 上传文件类/// </summary&g…

vue3 ts 集成 tinymce

首先引入 @tinymce/tinymce-vueyarn add @tinymce/tinymce-vue -S 我的版本是 然后写一个组件<template><main id="sample"><Editor v-model="editorData" api-key="j7tvgx4xnptg3cjd63cfnl62z9s78uylw4o7vkkwdljjy91e" :init=…

tinymce 集成 vue3 ts

首先引入 @tinymce/tinymce-vueyarn add @tinymce/tinymce-vue -S 我的版本是 然后写一个组件<template><main id="sample"><Editor v-model="editorData" api-key="j7tvgx4xnptg3cjd63cfnl62z9s78uylw4o7vkkwdljjy91e" :init=…

IBM X3650 M4服务器使用U盘重装系统教程

一、前期准备工作 1、已经制作完成的系统U盘(笔者使用魔术师制作的启动盘) 2、下载好的windows_server_2008_r2镜像 3、下载好的.M5110e阵列卡驱动 二、安装过程 1、将前期准备的镜像、阵列驱动拷贝到优盘根目录下2、优盘插入服务器后启动服务器,开机后会进入图1,等待后在图…

打开、关闭、切换App以及清除App进程,操作so easy!

有很多新手同学经常问到,如何优雅地快速打开、关闭、切换APP以及清除设备应用后台,那么本周我们来分享一下怎么优雅地实现这些操作吧此文章来源于项目官方公众号:“AirtestProject” 版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途#一、前言 很多新手…

稳定、省钱的 ClickHouse 读写分离方案:基于 JuiceFS 的主从架构实践

Jerry 是一家位于北美的科技公司,利用人工智能和机器学习技术,简化汽车保险和贷款的比价和购买流程。在美国,Jerry 的应用在其所属领域排名第一。 随着数据规模的增长,Jerry 在使用 AWS Redshift 时遇到了一些性能与成本的挑战。Jerry 重新设计了系统架构,使用 ClickHouse…

GDCL论文阅读笔记

Diffusion-Based Graph Contrastive Learning for Recommendation with Implicit Feedback论文阅读笔记 Abstract 提出问题: ​ 自监督学习模型大多采用随机辍学来构造附加的图视图,没有区分边的重要性。这些方法在捕获用户-项目交互图的结构属性方面的不足,导致了推荐性能的…

关于IDEA使用xml实现动态sql的问题

如上图,我在mapper层编写了一个list方法用于实现动态sql。 1.导入使用xml文件的mybatis依赖。 2.配置文件的修改 .properties .yml mybatis.mapper-locations=classpath:mapper/*.xml:这个配置项指定了 MyBatis 映射器 XML 文件的位置。 值 classpath:mapper/*.xml 表示 MyBa…

基于LoRa的智慧农业解决方案--ASR6601、SX1278、SX1262

我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”,加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。然而,目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面积广袤,大量的区域没…

服务器mac地址变化

检查是否开启了多路复用检查是否开启了随机硬件地址留待后查,同时方便他人 联系我:renhanlinbsl@163.com

基于阿里云实现手机号验证功能

一、阿里云手机短信验证码服务阿里云创建账号 https://home.console.aliyun.com/home/dashboard/ProductAndService搜索短信服务选择签名、资质管理、新增资质创建签名创建新模版,其中对映签名等信息查看模版获取ID 和 Key (1).选中头像,创建AccessKey创建工具类/// <summ…