空弱指针enable_shared_from_this



在公开继承enable_shared_from__fom_this并初始化类的对象之后,在调用该类的另一个函数时,我仍然可以看到enable_shared_shared_from_this_class的空弱指针在Visual Studio中进行调查时。

所有现有的问题都是由于从enable_shared_from__this私下继承而引起的,或者在构造函数中调用feek_from__this。对我来说不是这样。我目前正在使用C 捕获框架在Visual Studio调试器中测试此情况。在初始化函数中,我可以看到,该对象的弱_ptr为空。

标题文件:


template <typename T>
class IInfo
public:
IInfo()
    {}
    virtual ~IInfo()
    {}
    virtual bool RegisterForChange(FUNC_PTR<T> Callback, std::weak_ptr<T>) = 0;
};
template <typename T>
class Info : public IInfo<T>, public std::enable_shared_from_this<Info<T>>
{
public:
    Info() {}
    ~Info() {}
    virtual bool RegisterForChange(FUNC_PTR<T> Callback, std::weak_ptr<T> callerContext) override
    {
        //Some code
        _callerContext = callerContext;
    }
private:
    std::weak_ptr<T> _callerContext;
};

class Env : public std::enable_shared_from_this<Env>
{
public:
    Env();
    bool Initialize();
    static void func(/ some arguments / );
private:
    std::shared_ptr<Info<Env>>_spInfo;
    //other variables
}

CPP文件:

Env::Env() : _spInfo() // + other variables in initializer list
{
    _spInfo = std::make_shared<Info<Env>>();
}
bool Env::Initialize()
{
    _spInfo->RegisterForChange(FUNC_PTR<Env>func, this->weak_from_this());
}

测试案例:(使用的CPP捕获框架(

Env env;
env.Initialize();

编辑:根据注释,要求它正确,ENK模块将由插件管理,该插件将创建unique_ptr并调用初始化。类似:

    template<typename T>
    std::unique_ptr<T> BringUp()
    {
        std::unique_ptr<T> ptr(std::make_unique<T>());
        if (ptr && ptr->Initialize())
            return std::move(ptr);
    }
std::unique_ptr<Env> _envPtr;
_envPtr = BringUp<Env>();

我仍然面临同样的问题。在这种情况下,我应该如何管理env?

您的施工代码仍然错误。为了使shared_from_this工作,必须通过共享指针来管理对象的寿命。首先,您尝试通过范围管理它,然后尝试用独特的指针进行管理。这些都无法正常工作。

shared_from_this的要点是允许对象的寿命通过需要扩展的代码来扩展。为此,必须通过某种结构来管理对象的生命周期,以使对象延长其寿命。范围无法做到这一点,因为当范围结束时,对象的内存会释放。unique_ptr无法做到这一点,因为只有一个指向对象的指针可以随时存在,因此无法延长其寿命,因为这需要两个指针(一个必须已经存在,或者它将已经死了,一个延伸的一个它的生活将是另一个(。

使用std::make_shared构建Env对象并将std::shared_ptr存储到它。

    template<typename T>
    std::shared_ptr<T> BringUp()
    {
        std::shared_ptr<T> ptr(std::make_shared<T>());
        if (ptr && ptr->Initialize())
            return std::move(ptr);
    }
std::shared_ptr<Env> _envPtr;
_envPtr = BringUp<Env>();

相关内容

  • 没有找到相关文章

最新更新