问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

shared_ptr的用法

发布网友 发布时间:2022-07-15 21:05

我来回答

1个回答

热心网友 时间:2024-10-20 03:46

把对象直接存入容器中有时会有些麻烦。以值的方式保存对象意味着使用者将获得容器中的元素的拷贝,对于那些复制是一种昂贵的操作的类型来说可能会有性能的问题。此外,有些容器,特别是 std::vector, 当你加入元素时可能会复制所有元素,这更加重了性能的问题。最后,传值的语义意味着没有多态的行为。如果你需要在容器中存放多态的对象而且你不想切割它们,你必须用指针。如果你用裸指针,维护元素的完整性会非常复杂。从容器中删除元素时,你必须知道容器的使用者是否还在引用那些要删除的元素,不用担心多个使用者使用同一个元素。这些问题都可以用shared_ptr来解决。
下面是如何把共享指针存入标准库容器的例子。 #include boost/shared_ptr.hpp#include <vector>#include <iostream>class A {public:    virtual void sing()=0;    protected:    virtual ~A() {};};class B : public A {public:    virtual void sing() {        std::cout << Do re mi fa so la;    }};boost::shared_ptr<A> createA() {    boost::shared_ptr<A> p(new B());    return p;}int main() {    typedef std::vector<boost::shared_ptr<A> > container_type;    typedef container_type::iterator iterator;    container_type container;    for (int i=0;i<10;++i) {        container.push_back(createA());    }    std::cout << The choir is gathered: \n;    iterator end=container.end();    for (iterator it=container.begin();it!=end;++it) {        (*it)->sing();    }} 这里有两个类, A和 B, 各有一个虚拟成员函数 sing. B从 A公有继承而来,并且如你所见,工厂函数 createA返回一个动态分配的B的实例,包装在shared_ptr<A>里。在 main里, 一个包含shared_ptr<A>的 std::vector被放入10个元素,最后对每个元素调用sing。如果我们用裸指针作为元素,那些对象需要被手工删除。而在这个例子里,删除是自动的,因为在vector的生存期中,每个shared_ptr的引用计数都保持为1;当 vector被销毁,所有引用计数器都将变为零,所有对象都被删除。有趣的是,即使 A的析构函数没有声明为 virtual, shared_ptr也会正确调用 B的析构函数!
上面的例子示范了一个强有力的技术,它涉及A里面的protected析构函数。因为函数 createA返回的是 shared_ptr<A>, 因此不可能对shared_ptr::get返回的指针调用 delete。这意味着如果为了向某个需要裸指针的函数传送裸指针而从shared_ptr中取出裸指针的话,它不会由于意外地被删除而导致灾难。那么,又是如何允许 shared_ptr删除它的对象的呢? 这是因为指针指向的真正类型是 B; 而B的析构函数不是protected的。这是非常有用的方法,用于给shared_ptr中的对象增加额外的安全性。

shared_ptr的应用场景以及使用注意事项

对象间共享数据,对象的创建与销毁相分离,这是shared_ptr的主要应用场景之一。它允许在不直接管理内存的情况下,实现资源的共享。当动态对象被放入容器时,使用shared_ptr进行包装会比unique_ptr更合适,因为它能处理对象的引用计数,自动管理内存,避免内存泄漏。在管理动态数组时,需要明确指定Deleter以支持...

shared_ptr用法

在C++中,shared_ptr的主要作用是解决多个对象共享资源的生命周期管理问题。以类A和B为例,它们共享一个int值。使用shared_ptr时,需要包含"boost/shared_ptr.hpp"库。在代码中,创建了两个类A和B,它们的构造函数都接收一个shared_ptr实例。这样,temp、a和b三个shared_ptr都指向同一个int。当所有...

关于c++的shared_ptr?

在C++编程中,共享智能指针shared_ptr是一种用于管理动态分配的内存资源的工具。它能够追踪对象的生命周期,确保当对象不再被需要时,内存能被正确释放,避免内存泄漏问题。其中,shared_ptr的核心功能在于共享被管理对象的所有权。当创建一个shared_ptr实例时,它会自动管理所指向的对象的生命周期。这意味着...

C++ : shared_ptr是线程安全的吗?

1. **拷贝shared_ptr**:拷贝过程中主要操作的是引用计数,而引用计数的更新是原子操作,确保了线程安全。例如,假设两个线程同时对同一个shared_ptr进行拷贝,无论操作多少次,引用计数始终为20001,这表明它是安全的。2. **修改内存区域**:然而,对shared_ptr指向的内存进行并发修改则不保证线程安全...

共享指针shared_ptr

共享指针shared_ptr是C++中一种智能指针,专门用于管理动态创建对象的生命周期。它的主要功能在于自动管理对象的销毁,以消除内存泄漏和悬空指针的问题。以下是shared_ptr的工作原理、特点和创建方法,以及常见错误的避免策略。共享原理与特点 共享指针通过引用计数机制来管理对象的生命周期。每当新的shared_ptr...

shared_ptr作用

shared_ptr是一种特殊的智能指针,其设计类似于普通指针,但它具有独特的引用计数功能。每当有一个shared_ptr指向某个对象时,该对象的引用计数就会增加。当引用计数变为0,意味着没有shared_ptr再指向该对象,此时,系统会自动删除这个对象,从而避免了非环形数据结构中常见的资源泄露问题。相比之下,传统...

shared_ptr的用法

&lt;iostream&gt;class A {public: virtual void sing()=0; protected: virtual ~A() {};};class B : public A {public: virtual void sing() { std::cout &lt;&lt; Do re mi fa so la; }};boost::shared_ptr&lt;A&gt; createA() { boost::shared_ptr&lt;A&gt; p(new B()); ...

多线程访问shared_ptr需要加锁吗?(转)

shared_ptr 是一种引用计数型智能指针,用于管理堆上的对象生命周期,避免内存泄漏。其内部包含指向对象的指针 ptr 和引用计数 ref_count。ref_count 用于记录指向同一对象的 shared_ptr 的数量,当数量为 0 时,表示对象已被完全释放。在多线程环境下,若不加锁直接读写 shared_ptr,会导致竞态条件(...

C++智能指针的简单分析——shared_ptr和weak_ptr

shared_ptr的关键方法包括get()、use_count()、unique()、reset()和swap(ptr)等。注意事项尽管shared_ptr提供get()获取指针,但需谨慎使用,避免野指针。直接用指针构造shared_ptr可能导致资源重复删除,不建议。weak_ptr相比之下,weak_ptr更加简单,它不直接控制对象,仅作为shared_ptr的弱引用。使用...

C++11智能指针 shared_ptr、weak_ptr和unique_ptr详解

在共享引用相互关联的情境下,若不采取恰当措施如使用weak_ptr,可能会导致资源无法正常释放,例如两个shared_ptr相互引用时,会形成资源释放瓶颈,无法正常执行析构函数。引入weak_ptr机制后,如将一个shared_ptr转换为weak_ptr,或在构造时即为weak_ptr,可有效解除引用计数锁定,保障资源得以正确清理。un...

sharedptr的用法 share_ptr用法 shared_ptr原理 shared_ptr内存泄漏 智能指针shared_ptr shared_ptr源码 shared用法 sharedptr sharedptr线程安全
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
胶原蛋白线双眼皮是不是永久性 双眼皮埋线是蛋白质还是尼龙绳-双眼皮埋线蛋白线多久能吸收 人体输液的“港口”完全植入式输液港 双眼皮宽变窄修复的方法 同心保家庭重疾险靠不靠谱?便宜吗? 做完双眼皮一宽一窄怎么办 喝全脂奶粉对长高有没有什么好处? redmine中“选择一个项目..."下拉列表框中为什么只列出一个项目,我建... 南充市龙门中学实力现在怎样?他的奥赛班是重点班么? 感情中为什么总是不知足呢? shared_ptr的介绍 拿瓦,茨纳米,驮那多,酷雷伏,雅塔莱斯中,买哪一副铠甲的召唤器好? 吃了米和酷雷伏的铠甲召唤器怎么玩 茨纳米和酷雷伏召唤器出了没 shared_ptr的作用 酷雷伏召唤器钥匙怎么重涂玩具怎么重涂 《铠甲勇士拿瓦》柯胜的酷雷伏召唤器被李子抢去,铠甲应该是任何人都_百... 铠甲勇士酷雷伏召唤器多少钱在哪里卖 铠甲勇士拿瓦马天催毁了几个召唤器 铠甲勇士茨纳米为什么和酷雷伏用一个召唤器 求一部美国动画片电影的名字!!一名科学家为了一个警察的儿子而建了... 求动画片名,厨艺料理类了, 只记得其中一集里有提出做甜味的面条和麻辣冰... hadoop与memcache的区别与联系 沙河教师招聘2019 InDesign的2个版面的版心边距不同是怎么没设置出来的? indd软件怎么改版心 ID里想修改版心从哪设置来着? id里边可以设置角注大于版心的么 大腿静脉曲张,穿静脉曲张袜子有用吗 aoc显示器质量 充电手电筒3999万和4999万有什么区别 窑湾镇的旅游 苏州窑湾古镇有什么历史文化古迹? 有没有不会被刮花的手机贴膜?听人说玻璃贴膜,是不会被刮花的吗? 接图片一直在转圈,手机和手机信号没问题,就是图片无法下载?是什 ... 用刀裁的贴膜会伤到手机吗? 苏北小上海是哪座古镇的美称了?南京出发一天可来回么? 我接图片是一直在转圈圈,手机和手机信号没问题,就是图片无法下载... 苹果手机没电关机了之后充电一直没反应?该怎么办 苹果手机玩没电了,充电开机不了? 二次元包含什么? 龙与虎小说有几本 轻小说《龙与虎》一共几本? 动漫《龙与虎》的作者,和相关作品! 怎么才能让在别的手机上登录不用验证码 计算机虚拟现实升本后是什么? 保监会1 4文件4指的是 强制删除电脑文件4 国务院下发4号文件的详细内容 羽毛球打球有什么口诀???