抛出 'std::bad_weak_ptr' 实例后终止调用what(): bad_weak_ptr?

jus*_*hen 6 c++ inheritance shared-ptr weak-ptr enable-shared-from-this

我正在学习智能指针和shared_from_this. 在类继承关系中,会很难理解。

我有两个基类CACB,它们派生自enable_shared_from_this,子类CC派生自CACB。我想从类自身中取出三个类的共享指针,所以我写了sharedCAfromThis,sharedCBfromThissharedCCfromthis

class CA  : private enable_shared_from_this<CA> {
public:
    shared_ptr<CA> sharedCAfromThis() { return shared_from_this();  }
    virtual ~CA() {};
    void print() {
        cout << "CA" << endl;
    }
};

class CB : private enable_shared_from_this<CB> {
public:
    shared_ptr<CB> sharedCBfromThis() { return shared_from_this();  }
    virtual ~CB() {};
    void print() {
        cout << "CB" << endl;
    }
};

class CC : public CA, CB {
public:
    shared_ptr<CC> sharedCCfromThis() { return dynamic_pointer_cast<CC>(sharedCAfromThis());  }
    virtual ~CC() {};
    void print() {
        cout << "CC" << endl;
    }
};

int main()
{
    shared_ptr<CC> cc_ptr = make_shared<CC>();
    cc_ptr->sharedCAfromThis()->print();
    //shared_ptr<C> c_ptr = make_shared<C>();
    //c_ptr->get_shared_b()->printb();
    while (1);
}
Run Code Online (Sandbox Code Playgroud)

但我错了,问题是:

class CA  : private enable_shared_from_this<CA> {
public:
    shared_ptr<CA> sharedCAfromThis() { return shared_from_this();  }
    virtual ~CA() {};
    void print() {
        cout << "CA" << endl;
    }
};

class CB : private enable_shared_from_this<CB> {
public:
    shared_ptr<CB> sharedCBfromThis() { return shared_from_this();  }
    virtual ~CB() {};
    void print() {
        cout << "CB" << endl;
    }
};

class CC : public CA, CB {
public:
    shared_ptr<CC> sharedCCfromThis() { return dynamic_pointer_cast<CC>(sharedCAfromThis());  }
    virtual ~CC() {};
    void print() {
        cout << "CC" << endl;
    }
};

int main()
{
    shared_ptr<CC> cc_ptr = make_shared<CC>();
    cc_ptr->sharedCAfromThis()->print();
    //shared_ptr<C> c_ptr = make_shared<C>();
    //c_ptr->get_shared_b()->printb();
    while (1);
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误消息?

您好,是的,非常感谢您,我将私有更改为公共,但问题仍然存在。我的gcc版本是8.0;我将代码更改如下。

class CA  : public enable_shared_from_this<CA> {
public:
    shared_ptr<CA> sharedCAfromThis() { return shared_from_this();  }
    virtual ~CA() {};
    void print() {
        cout << "CA" << endl;
    }
};

class CB : public enable_shared_from_this<CB> {
public:
    shared_ptr<CB> sharedCBfromThis() { return shared_from_this();  }
    virtual ~CB() {};
    void print() {
        cout << "CB" << endl;
    }
};

class CC : public CA, CB, enable_shared_from_this<CC> {
public:
    shared_ptr<CC> sharedCCfromThis() { return dynamic_pointer_cast<CC>(sharedCAfromThis());  }
    virtual ~CC() {};
    void print() {
        cout << "CC" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

L. *_* F. 5

您应该公开继承自enable_shared_from_this. 根据[util.smartptr.shared.const]/1

\n\n
\n

在下面的构造函数定义中,对于类型为 的指针,启用shared_\xc2\xadfrom_\xc2\xadthis\n意味着如果有一个\n 明确且可访问的基类,该基类是\n 的特化 ,则应\n 隐式转换为\n并且构造函数计算\n 语句:ppY*Yenable_\xc2\xadshared_\xc2\xadfrom_\xc2\xadthisremove_\xc2\xadcv_\xc2\xadt<Y>*T*

\n\n
if (p != nullptr && p->weak_this.expired())\n  p->weak_this = shared_ptr<remove_cv_t<Y>>(*this, const_cast<remove_cv_t<Y>*>(p));\n
Run Code Online (Sandbox Code Playgroud)\n\n

对成员的分配weak_\xc2\xadthis不是原子的,并且与对同一对象的任何潜在并发访问发生冲突([intro.multithread])。

\n
\n\n

如果使用私有继承,则无法再访问基类。

\n