首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅析C++中的CRTP

{ 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

6300
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    灵魂拷问std::enable_shared_from_this,揭秘实现原理

    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

    2.7K10

    C++ 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 函数替换失败

    1.1K30

    实现一个strong_rc_ptr(非线程安全版本的std::shared_ptr)

    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%的综合性能,这里面其实附带了其他的一些视图和索引的比较操作和其他

    10110

    再探 智能指针

    使用任何一项工具,都需要承担代价与风险的。 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

    29120

    掌握C++中智能指针的综合指南:深入现代内存管理

    简单的说,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才能构造。

    24900

    C++ 共享指针四宗罪

    更甚者,染毒者连换用其他“毒品”的权力都没有: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的第三宗罪——欺世盗名。 第四宗罪 最后一宗罪,是铺张浪费。

    54650

    使用C++实现一套简单的状态机模型——原理解析

    CAutoStateChartMachine,该模板类有两个参数:继承类自身和CStoreofMachine。...第一个模板参数是继承类自身,第二个是它所属的状态机,第三个是“数据库”类。...这个模板类继承于CLocalStoreAccess模板类,使得继承类具有可以“访问”第三个模板参数类——“数据库”类的能力——不具备“存储”能力。...状态和存储类都介绍完了,我们就剩下调度状态变化的状态机类和复合状态类。其实从某种程度上说,复合状态是一种简单的状态机,它们在很多地方存在共性。我们从状态机类入口,进行讲解。...boost::shared_ptr> m_spStore; };         我们先看下这个类的成员变量。

    1.9K30

    Chapter 4: Smart Pointers

    ,比如,当从工厂函数返回的 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

    1.6K20
    领券