异常:bad_weak_ptr同时共享from_this

exception: bad_weak_ptr while shared_from_this

本文关键字:共享 from this ptr bad weak 异常      更新时间:2023-10-16

当我这样做时,我得到异常:std::bad_weak_ptr->shared_from_his()

template<typename TChar>
class painter_record_t
{
.......
private:
    std::shared_ptr<i_painter_t> _owner;
}

在这里,我想在构造函数中设置"问题"对象:

template<typename TChar>
class stream_record_t : public painter_record_t<TChar>
{
public:
    stream_record_t(std::shared_ptr<i_painter_t> owner) : painter_record_t(owner)
    {
    //...
    }
}

我有基本类:

class i_painter_t
{
public:
    virtual std::unique_ptr<painter_record_t<char>> get_entry() = 0;
}

和派生类,我想在其中向基本抽象类发送智能指针,但得到一个异常:

class painter_t : public i_painter_t, public std::enable_shared_from_this<painter_t>
{
public:         
    std::unique_ptr<painter_record_t<char>> get_entry()
    {               
        return std::unique_ptr<painter_record_t<char>>(new stream_record_t<char>(static_cast< std::shared_ptr<i_painter_t> >(this->shared_from_this())));
    }
}

我也尝试过这个,但有同样的问题:

class painter_t : public i_painter_t, public std::enable_shared_from_this<painter_t>
{
public:         
    std::unique_ptr<painter_record_t<char>> get_entry()
    {               
        return std::unique_ptr<painter_record_t<char>>(new stream_record_t<char>(this->shared_from_this()));
    }
}

为了使enable_shared_from_this工作,您需要在调用shared_from_this()之前将指向this的指针存储在std::shared_ptr中。

请注意,在对对象t调用shared_from_this之前,必须有一个拥有t的std::shared_ptr。

您可能希望使painter_t构造函数私有化,并公开一个工厂方法,以确保创建的每个painter_t都由shared_ptr:管理

class painter_t : public i_painter_t, public std::enable_shared_from_this<painter_t>
{
public:
    static std::shared_ptr<painter_t> create() { return std::make_shared<painter_t>(); }
}