通过两个实例代码的对比,我们可以发现问题的根源所在就是我们在返回this的智能指针时,直接调用std::shared_ptr构造函数传入裸指针的方式构造一个智能指针, 而在之前的介绍中我们提到过使用智能指针shared_ptr时尽量使用std::make_shared进行智能指针的构造,避免直接调用std::shared_ptr构造函数传入裸指针的方式进行构造。
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 类中有继承...
enable_shared_from_this从本质上来说解决了不能直接冲this对象构造智能指针的问题,但是使用时也需要注意,既返回的智能智能必须要通过shared_from_this()获取,当然也可以不用,但是从大家的开发经验来看,真心劝解不要盲目自大。 1 enable_shared_from_this如何使用 代码语言:javascript 复制 classMyCar:publicstd::enab...
从enable_shared_from_this 派生的对象可以在成员函数中使用 shared_from_this 方法来创建实例的 shared_ptr 所有者,这些所有者与现有 shared_ptr 所有者共享所有权。 否则,如果使用 this 创建一个新的 shared_ptr,则其与现有的 shared_ptr 所有者不同,从而会导致无效引用或导致此对象被删除多次。
enable_shared_from_this的使用 为了保证不出现上面的情况,C++引入了enable_shared_from_this来解决这个问题(该方法是侵入式的,也可以手动保证只有构造第一个指向被持有对象的shared_ptr实例是由原始指针构造的),该方法将enable_shared_from_this<T>作为基类来继承(其中T为智能指针持有的类型),使得派生类拥有可以从th...
从上面可以得到,enable_shared_from_this 的成员 weakthis 不是在 enable_shared_from_this 的构造函数中初始化的,而是通过 _internal_accept_owner 来赋初值的。而这个函数是 shared_ptr 在初始化的时候调用的。得出结论:不要在构造函数中使用 shared_from_this....
enable_shared_from_this 是什么 std::enable_shared_from_this 是一个类模板,用来返回指向当前对象的shared_ptr智能指针。在说明它的作用前我们可以看一下如下代码: demo.cpp #include <memory>#include <iostream>class A{public:A() { std::cout << "A()" << std::endl; }~A() { std::cout <<...
enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template<classT>classenable_shared_from_this; std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ...
`enable_shared_from_this`的作用是为一个类提供一个函数`shared_from_this`,该函数能够返回一个指向当前对象的`shared_ptr`。这样,我们就可以将这个`shared_ptr`传递给其他对象,从而实现在多个对象之间共享当前对象。 `enable_shared_from_this`的具体实现如下: ```cpp template<class T> class enable_shared_...
这个时候需要通过enable_shared_from_this来解决问题 enable_shared_from_this的使用 classclient:publicstd::enable_shared_from_this<client> { public: ~client() { std::cout<<"~client()\n"; } std::shared_ptr<client> get_ptr() { returnshared_from_this(); ...