{ public: void foo() { // 在成员函数中调用 shared_from_this() 获取指向自身的 std::shared_ptr std::shared_ptr...的成员函数中调用 shared_from_this() 方法 objPtr->foo(); return 0; } 自定义类继承自模板类std::enable_shared_from_this,便可以在自定义类中使用模板类中的...只有调用shared_ptr的构造函数且自定义类继承自std::enable_shared_from_this时才会给弱指针赋值。如果弱引用指针未被赋值,空指针强转会触发异常。...回归CRTP,自定义类需要将自身作为模板参数传递给 std::enable_shared_from_this,在派生类中才可以使用 std::enable_shared_from_this 提供的 shared_from_this...{ //error, error C2440: “初始化”: 无法从“std::shared_ptr”转换为“std::shared_ptr” //std::shared_ptr
我们来看看具体的代码实现逻辑: struct Good: std::enable_shared_from_this // 注意:继承 { std::shared_ptr...这里我们可以看到,Good类继承了std::enable_shared_from_this,并且自己是作为模板参数传递给父类的。...它的能够规避上述问题的原因如下: 通过自身维护了一个std::weak_ptr让所有从该对象派生的shared_ptr都通过了std::weak_ptr构造派生。...std::shared_ptr的构造函数判断出对象是std::enable_shared_from_this的之类之后也会同样通过对象本身的std::weak_ptr构造派生。...1.2:CRTP的使用 我们重点来看看,这个CRTP在上文的enable_shared_from_this之中起到了怎么样的作用。从1.1的代码之中我们可以看到。
std::shared_ptr是一种允许多个指针共享对象所有权的智能指针。然而,当一个对象需要获取对自身的shared_ptr时,传统的方法可能导致未定义行为。...enable_shared_from_this的public、private继承为何需要特别注意,不然会引发什么问题? enable_shared_from_this内部的实现细节你知道多少呢?...公开继承 std::enable_shared_from_this 的类可以通过调用方法 shared_from_this() 获得指向自己的 shared_ptr。...类初识 std::enable_shared_from_this 的实现是一个类,它只包含一个 weak_ptr 字段(通常称为 _M_weak_this),这里面有很多细节:看看你知道吗?...的构造函数,此时我们可以看到会调用_M_enable_shared_from_this_with,它是一个模版函数,此时会使用ADL从enable_shared_from_this类中查找enable_shared_from_this
因为我们继承了 std::enable_shared_from_thi,因此就可以拿到这个方法,它返回的是一个当前指针的 std::shared_ptr. 那么它是怎么实现的呢?..._weak_this_ 是谁创建的,以及在什么时机创建的: Answer: 在创建 shared_ptr 的时候(T 继承自 enable_shared_from_this), 初始化了 enable_shared_from_this...,shared_ptr 怎么知道一个类型有没有继承自 enable_shared_from_this 呢?...value 返回 true 的话,也就是说我们的裸指针可以转换为 enable_shared_from_this*>::value, 其实也就是说,我们的裸指针类型是继承自 enable_shared_from_this...所以这句话的意思就是说,如果传入的裸指针类型是继承自 enable_shared_from_this 的,那么 返回 void 类型,否则返回空,让 __enable_weak_this 函数替换失败
而这同时也说明:智能共享指针不能够直接从this对象进行构造。 好了。现在开始进入正题。聊聊我们今天的重点:enable_shared_from_this。...:endl; std::cout std::endl; return 0; } 上面的代码定义了一个类,然后继承了std::enable_shared_from_this...从运行结果来看,使用std::enable_shared_from_this解决了:不能通过原指针增加引用次数的问题。...除此之外,在使用std::enable_shared_from_this时要保证类是公有继承的,至于为什么不能私有继承或者受保护的继承,欢迎大家留言评论。...的继承使得后面对智能指针进行初始化时同时初始化了弱指针。
image enable_shared_from_this 一个类的成员函数如何获得指向自身(this)的 shared_ptr? 看看下面这个例子有没有问题?...image 成员函数获取 this 的 shared_ptr 的正确的做法是继承 std::enable_shared_from_this。...std::enable_shared_from_this 的子类,成员变量中增加了一个指向 this 的 weak_ptr。...image 似乎继承了 std::enable_shared_from_this 的类都被强制必须通过 shared_ptr 进行管理。...通过继承 std::enable_shared_from_this 来获取 this 的 std::shared_ptr 对象。
// 宏前面加上##的作用在于,可以接受参数为0个或者多个 std::shared_ptr总结 判断 shared_ptr是否空 std::shared_ptr testPtr...和普通指针的相互转化 TestClass* pTest = new TestClass; std::shared_ptr ptr_test = std::...shared_ptr(pTest); //普通指针转shared_ptr //此处 pTest 不用手动释放 因为 ptr_test 的引用计数为1 std....get(); //shared_ptr转普通指针 获取自身的std::shared_ptr 指针 继承自 std::enable_shared_from_this 调用 shared_from_this...() class FIniSection : public std::enable_shared_from_this; auto self = shared_from_this
1、std::enable_shared_from_this 实际开发中,有时候需要在类中返回包裹当前对象(this)的一个 std::shared_ptr 对象给外部使用,C++ 新标准也为我们考虑到了这一点...,有如此需求的类只要继承自 std::enable_shared_from_this 模板对象即可。...std::enable_shared_from_this 并提供一个 getSelf() 方法返回自身的 std::shared_ptr 对象,在 getSelf() 中调用 shared_from_this...1,然后就销毁自身了。...,而不是直接包含对应类的头文件。
其中std::shared_ptr是智能指针,一下是最简单的用法 std::shared_ptr a = std::shared_ptr(new int()), b = std...或者最简单的自环,a.p = &a; 引用技术至少为1。...int* p = new int(); std::shared_ptr a = std::shared_ptr(p), b = std::shared_ptr(p); scanf...但是某些情况下我们需要返回自己的智能指针怎么办呢,又有个新玩意,std::enable_shared_from_this ,只要继承它,就有一个成员方法shared_from_this用于返回自身的智能指针...```cpp class foo: public std::enable_shared_from_this { public: typedef std::shared_ptr
本篇介绍 本篇继续C++的模版介绍 std::enable_if enable_if 的作用是满足条件后可以使用模版推导,基于SFINAE(substitution failure is not...= std::is_convertible_vstd::string>; 编译时的if c++17支持编译时的if,这样就可以在编译态作为开关,如下所示: template0 (since C++17) } } enable_shared_from_this 遇到需要用this 构造shared_ptr的时候都需要继承一下 enable_shared_from_this...> 14 template friend class shared_ptr; }; 这里面有一个_weak_this, 可是没有赋值的地方,那是哪儿赋值的呢?...看下他的实现: shared_ptr::shared_ptr(_Yp* __p, typename enable_if<is_convertible
其中std::shared_ptr是智能指针,一下是最简单的用法 std::shared_ptr a = std::shared_ptr(new int()), b = std...或者最简单的自环,a.p = &a; 引用技术至少为1。...int* p = new int(); std::shared_ptr a = std::shared_ptr(p), b = std::shared_ptr(p); scanf...但是某些情况下我们需要返回自己的智能指针怎么办呢,又有个新玩意,std::enable_shared_from_this ,只要继承它,就有一个成员方法shared_from_this用于返回自身的智能指针...class foo: public std::enable_shared_from_this { public: typedef std::shared_ptr type_ptr
::enable_shared_from_this 实际开发中,有时候需要在类中返回包裹当前对象(this)的一个 std::shared_ptr 对象给外部使用,C++ 新标准也为我们考虑到了这一点,...有如此需求的类只要继承自 std::enable_shared_from_this 模板对象即可。...std::enable_shared_from_this 并提供一个 getSelf() 方法返回自身的 std::shared_ptr 对象,在 getSelf() 中调用 shared_from_this...1,然后就销毁自身了。...,而不是直接包含对应类的头文件。
enable_shared_from_this 的两种实现 接下来是 enable_shared_from_this 的实现。...要实现继承 enable_shared_from_this 的对象自动带 share_from_this() 接口,首先基类需要记录一个 weak_ptr/weak_rc_ptr 。...然后构造 shared_ptr 的时候检测目标指针可否转换成 enable_shared_from_this 指针。...std::shared_ptr 和 boost::shared_ptr 的差异 在写单元测试的时候,我发现 std::shared_ptr 和 boost::shared_ptr 的实现上还有一些行为上的差异...我们在完成之后对我们实际项目路14-16个静态索引的交易行上下架请求和搜索的场景做了对比(不包含Excel读表改造),大概比 std::shared_ptr 提升了10%-16%的综合性能,这里面其实附带了其他的一些视图和索引的比较操作和其他
使用任何一项工具,都需要承担代价与风险的。 1、一个裸的指针不要用两个shared_ptr管理,unique_ptr也是,它们都会认为自己独占这个资源,你等释放的时候试试看。...3、当需要在类的内部接口中,如果需要将this作为智能指针来使用的话,需要用该类派生自enable_shared_from_this。...enable_shared_from_this和shared_from_this在构造和析构中是不能使用的,在某些情况下也不能使用,因为构造的时候类还未生成好,析构的时候类快完蛋了都没有意义。...:shared_ptr ChildPtr; typedef std::weak_ptr WeakChildPtr; class Parent : public std::enable_shared_from_this...(4)); SharedObjectPtr sharedObj(std::move(obj)); assert(obj == nullptr); // shared_ptr weak_ptr enable_shared_from_this
shared_ptr代表的是共享所有权,即多个shared_ptr可以共享同一块内存。 因此,从语义上来看,shared_ptr是支持复制的。...当一个shared_ptr离开作用域时,引用计数会-1。当引用计数为0的时候,则delete内存。 同时,shared_ptr也支持移动。从语义上来看,移动指的是所有权的传递。...我们往往会需要在类内部使用自身的shared_ptr,例如: class Widget { public: void do_something(A& a) { a.widget...对于这种,需要在对象内部获取该对象自身的shared_ptr, 那么该类必须继承std::enable_shared_from_this。...代码如下: class Widget : public std::enable_shared_from_this { public: void do_something(A& a
std::enable_shared_from_this::weak_from_this 详解一、weak_from_this 的作用weak_from_this 是 std::enable_shared_from_this...例如,有两个类 A 和 B,它们相互持有对方的 std::shared_ptr,就会形成循环引用。...std::enable_shared_from_this {public: std::shared_ptr a_ptr; ~B() { std::cout std::enable_shared_from_this {public: std::shared_ptr...在设计系统时,合理使用 std::weak_ptr 和 std::shared_ptr 可以有效管理对象的生命周期,避免内存泄漏和未定义行为。
简单的说,shared_ptr实现包含了两个部分:(1)一个指向堆上创建的对象的裸指针 raw_ptr。(2)一个指向内部隐藏的、共享的管理对象 shared_count_object。...2.1、shared_ptr内存模型shared_ptr内部包含两个指针,一个指向对象,一个指向控制块。控制块包含一个引用计数、一个弱计数和其他数据(比如删除器、分配器等)。...正确返回this的shared_ptr的做法是:让目标类继承std::enable_shared_from_this类,然后使用基类的成员函数shared_from_this()返回this的shared_ptr...= sp; f(); }f(); return 0; }4.2、weak_ptr返回this指针shared_ptr中提到不能直接将this指针返回shared_ptr,需要通过派生std::enable_shared_from_this...需要注意的是,获取自身智能指针的函数仅在shared_ptr的构造函数被调用之后才能使用,因为enable_shared_from_this内部的weak_ptr只有通过shared_ptr才能构造。
更甚者,染毒者连换用其他“毒品”的权力都没有:shared_ptr的引用计数管理接口是私有的,无法从shared_ptr之外操控,也就无法从shared_ptr迁移到其他类型的引用计数智能指针。...第三宗罪 在一些用例中,资源对象的成员方法(不包括构造函数)需要获取指向对象自身,即包含了this指针的shared_ptr。...为了解决这个问题,Boost提供了一个类模板enable_shared_from_this: 所有需要在成员方法中获取指向this的shared_ptr的类型,都必须以CRTP手法继承自enable_shared_from_this...接着,资源对象的成员方法就可以使用enable_shared_from_this::shared_from_this()方法来获取所需的指向对象自身的shared_ptr了。...这样的继承体系不就对资源对象的实现有要求了吗?换言之,这不正是对资源对象实现的赤裸裸的侵入吗?这正是shared_ptr的第三宗罪——欺世盗名。 第四宗罪 最后一宗罪,是铺张浪费。
CAutoStateChartMachine,该模板类有两个参数:继承类自身和CStoreofMachine。...第一个模板参数是继承类自身,第二个是它所属的状态机,第三个是“数据库”类。...这个模板类继承于CLocalStoreAccess模板类,使得继承类具有可以“访问”第三个模板参数类——“数据库”类的能力——不具备“存储”能力。...状态和存储类都介绍完了,我们就剩下调度状态变化的状态机类和复合状态类。其实从某种程度上说,复合状态是一种简单的状态机,它们在很多地方存在共性。我们从状态机类入口,进行讲解。...boost::shared_ptr> m_spStore; }; 我们先看下这个类的成员变量。
,比如,当从工厂函数返回的 std::unique_ptr 被移动到一个容器中,而这个容器后来又被移动到一个对象的数据成员中。...因为这些自定义析构器的内存和 std::shared_ptr 内存不是同一片内存 更具体的说, std::shared_ptr 包含的是一个指向对象的指针和一个指向控制块的指针,而这个控制块里面包含引用计数...processWidgets.emplace_back(this); } 标准库中解决这个问题的方式是让 Widget 类继承自 std::enable_shared_from_this 类...为了防止这种情况,继承自 std::enable_shared_from_this 的类通常把构造函数声明为 private ,然后通过调用工厂函数来创建对象,并返回 std::shared_ptr...不是一个独立的智能指针,而是 std::shared_ptr 的强化版 std::weak_ptr 通常是从 std::shared_ptr 中创建,它们指向同一个对象, std::weak_ptr
领取专属 10元无门槛券
手把手带您无忧上云