make_shared会调用allocate_shared,随后调用shared_ptr的构造函数,再调用__shared_ptr的构造函数,此时我们可以看到会调用_M_enable_shared_from_this_with,它是一个模版函数,此时会使用ADL从enable_shared_from_this类中查找enable_shared_from_this。 代码语言:javascript 复制 template<typename _Alloc,typename..._A...
std::enable_shared_from_thisallows an objecttthat is currently managed by astd::shared_ptrnamedptto safely generate additional std::shared_ptr instancespt1,pt2, ... that all share ownership oftwithpt. Publiclyinheriting fromstd::enable_shared_from_this<T>provides the type T with a member ...
std::enable_shared_from_this是模板类,内部有个_Tp类型weak_ptr指针,调用shared_from_this成员函数便可获取到_Tp类型智能指针,从这里可以看出,_Tp类型就是我们的目标类型。再来看看std::enable_shared_from_this的构造函数都是protected,因此不能直接创建std::enable_from_shared_from_this类的实例变量,只能作为基...
1namespacetest_enable_shared_from_this{23classDerived :publicstd::enable_shared_from_this<Derived>4{5public:6voidSetValue(inta)7{8_a =a;9}10intGetValue()const11{12return_a;13}14private:15int_a;16};1718classDerived1 :publicstd::enable_shared_from_this<Derived1>19{20private:21int_b;2...
std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。 若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员...
本文还会涉及对std::enable_shared_from_this ,以及指针悬空状态的演示,std::make_shared 的性能。1....
1.1 enable_shared_from_this 但是我们很难避免需要把this指针当做std::shared_ptr参数传递的场景,怎么办呢? C++当然针对这个问题,是有方案的,那就是使用 std::enable_shared_from_this,上面代码修改如下: #include<iostream>#include<memory>#include<unistd.h>class A:public std::enable_shared_from_this<A>...
enable_shared_from_this通过weak_ptr来实现,在创建此派生类对象智能指针时,会初始化好weak_ptr指针。翻看源码可知,在shared_ptr的构造函数中会调用到_Resetp0,然后间接的最终会调用到_Do_enable函数,_Do_enable会设置好weak_ptr指针。从这也可以知道,若要用到enable_shared_from_this,则必须创建智能指针,否则weak...
在日常c++编程中,为了更好的管理资源,我们通常借助shared_ptr来达到对资源的自动管理。由于其原理是通过过跟踪引用计数实现的,也就是说在使用了shared_ptr后就不能再使用裸指针this。比如说在类的内部直接使用std::shared_ptr<XX>(this),就会导致智能指针失效。
std::enable_shared_from_this是模板类,内部有个_Tp类型weak_ptr指针,调用shared_from_this成员函数便可获取到_Tp类型智能指针,从这里可以看出,_Tp类型就是我们的目标类型。 再来看看std::enable_shared_from_this的构造函数都是protected,因此不能直接创建std::enable_from_shared_from_this类的实例变量,只能作为...