首页 > 其他分享 >shared_ptr的概念和一些特性调查

shared_ptr的概念和一些特性调查

时间:2024-05-17 11:43:59浏览次数:18  
标签:特性 base 基类 test shared unique ptr

shared_ptr

概念

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

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

特性

线程安全的说明

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

二进制兼容性

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

陈硕博客

shared_ptr的析构函数可以调用基类的没有设置为virtual的析构函数

#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;
image

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

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

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

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

标签:特性,base,基类,test,shared,unique,ptr
From: https://www.cnblogs.com/hy227/p/18197541

相关文章

  • 前瞻 PHP8.4 的新特性
    前瞻PHP8.4的新特性PHP8.4将于2024年11月21日发布。它将包括属性钩子、JIT改进,以及在不需要额外括号的情况下链式调用方法。这是一个大变化!属性钩子RFC现代PHP历史上最大的变化之一:定义属性钩子的能力。classBookViewModel{publicfunction__construct(......
  • ❤️‍ Solon Cloud Event 新的事务特性与应用
    1、SolonCloudEvent?是Solon分布式事件总线的解决方案。也是Solon“最终一致性”分布式事务的解决方案之一2、事务特性事务?就是要求Event有原子性,当多个Event发布时,要么全成功,要么全失败。publicclassEventDemo{publicvoidevent_tran(){//新建......
  • Python函数与模块的精髓与高级特性
    本文分享自华为云社区《Python函数与模块的精髓与高级特性》,作者:柠檬味拥抱。Python是一种功能强大的编程语言,拥有丰富的函数和模块,使得开发者能够轻松地构建复杂的应用程序。本文将介绍Python中函数和模块的基本使用方法,并提供一些代码实例。1.函数的定义与调用函数是一段......
  • Java8新特性
    1Lambda表达式1.1使用Lambda表达式实现函数式接口1【案例1】函数是接口MyInterOne//函数式接口(接口中只有一个抽象方法)@FunctionalInterfacepublicinterfaceMyInterOne{publicabstractvoidmethodOne();}【案例2】定义MyInterOneImpl类实现接口MyInterOnepub......
  • ES 2024 新特性
    ECMAScript2024新特性ECMAScript2024,the15thedition,addedfacilitiesforresizingandtransferringArrayBuffersandSharedArrayBuffers;addedanewRegExp/vflagforcreatingRegExpswithmoreadvancedfeaturesforworkingwithsetsofstrings;andi......
  • OSCP靶机训练Kioptrix Level 2
    Vulnhub——KioptrixLevel2前期准备:kali攻击机:10.0.0.4靶机:10.0.0.11网络适配器全部设置为NAT模式靶机需要去配置文件中将所有Bridge改为nat渗透过程第一步:主机存活探测arp-scan-l第二步:端口扫描nmap--min-rate10000-p-10.0.0.11第三步:基本信息扫描nmap......
  • OSCP靶机训练Kitoptrix Level 3
    Vulnhub——KioptrixVM3前期准备:kali攻击机:10.0.0.4靶机:10.0.0.12将两台机器都设置为NAT模式渗透过程:第一步:存活主机探测arp-scan-l第二步:端口扫描nmap--min-rate10000-p-10.0.0.12第三步:基本信息扫描nmap-sT-sC-sV-O-p22,8010.0.0.12第四步:WEB渗......
  • OSCP靶机训练Kioptrix Level 4
    Vulnhub——KioptrixLevel4前期准备:kali攻击机:10.10.10.12靶机:10.10.10.15将两台机器都设置为NAT模式渗透过程1、首先是存活主机探测,确认目标是否在线arp-scan-l2、然后对目标进行端口扫描, 确认目标开放了哪些端口以及服务3、开放了4个端口,首先目光集中在80端......
  • OSCP靶机训练Kioptrix Level 1
    Vulnhub——KioptrixLevel1前期准备:​ 1、kali攻击机:10.0.0.4 NAT模式​ 2、靶机:10.0.0.10 NAT模式​ 注意:​ 该靶机默认为桥接模式,且在虚拟机中修改为NAT模式,在靶机启动之后又自动更改为了桥接模式​ 需要在靶机的配置文件中进行修改​ 将所有Bridge修改为nat即可......
  • 在PLC的扫描特性下,FOR循环里面套IF或者定时器会发生什么?
    1.为什么会提出这个题目在PLC指令的执行过程中,FOR循环会在每个扫描周期执行完一个循环,然后程序才会接着往下扫描在PLC指令的执行过程中,IF判断会在每次扫描中判断一次条件,满足则进入执行体,不满足则跳出IF把IF放在FOR循环里面,会导致循环体执行时间过长,或者其他问题吗?(答案是不会......