总结一下shared_from_this的使用注意事项

文章讲述了C++中enable_shared_from_this的作用,如何正确使用shared_from_this获取自身引用,以及在从第三方类继承时可能遇到的问题,特别强调了构造函数中不可调用shared_from_this和使用parent指针创建shared_ptr可能导致的错误。
摘要由CSDN通过智能技术生成
  • 类必须从std::enable_shared_from_this继承,并且T必须是类本身。
  • 在类的成员函数中,可以通过调用shared_from_this()来获取一个指向自己的shared_ptr。
  • 在使用shared_from_this()之前,必须确保存在至少一个shared_ptr对象来管理该类的生命周期,否则会抛出std::bad_weak_ptr异常。
  • 不要在类的构造函数中调用shared_from_this(),因为在构造函数中shared_ptr还没有创建。
  • enable_shared_from_this必须要public继承。
  • 使用shared_ptr(pointer)来构建shared_ptr时没有考虑指针指向的实际对象,没有多态性,这可能会引起一些隐秘的错误,下面是一个例子:
#include <iostream>
#include <memory>

using namespace std;
class Base
{
    virtual void baseVTable() {};  //模拟基类是一个多态类型,否则dynamic_cast报错
};
class Derived : virtual public Base, public enable_shared_from_this<Derived>
{
public:
    int a = 10;

    void test()
    {
        cout << shared_from_this()->a << endl;
    }
};
int main() 
{
    auto childSPtr = make_shared<Derived>();
    childSPtr->test();  //输出10

    Base* ptr = new Derived();
    shared_ptr<Base> sPtr = shared_ptr<Base>(ptr);
    shared_ptr<Derived> derivedSPtr = dynamic_pointer_cast<Derived>(sPtr);
    derivedSPtr->test();    //报错
}

在这个例子中,使用指向子类实例的父类指针去创建shared_ptr时,shared_ptr()不知道这个父类指针指向的对象实际上继承了enable_shared_from_this,也就没有做相应的赋值,shared_from_this()会产生报错。
先创建子类的shared_ptr后再转换为父类的shared_ptr就能避免报错。

前四条参考:从第三方定义的类继承时的shared_from_this

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值