gpt4 book ai didi

c++ - 我可以检查 `shared_from_this` 是否可以安全调用吗?

转载 作者:行者123 更新时间:2023-11-28 01:32:59 25 4
gpt4 key购买 nike

当从继承自 enable_shared_from_this 的类型中调用 shared_from_this 时,如果 this 当前未被 shared_ptr 对象持有(通常是应用程序崩溃),可能会发生非常糟糕的事情 (TM)。是否可以在 C++14(不是 17)中检查它是否安全?

编辑:不使用异常或 try/catch。

最佳答案

这是一个实现细节,但是你能不能对内部友元声明做一些讨厌的事情:

template<typename _Tp1>
friend void
__enable_shared_from_this_helper(const __shared_count<>& __pn,
const enable_shared_from_this* __pe,
const _Tp1* __px) noexcept

使用 _Tp1 作为 weak_ptr<>* 实现您自己的版本,它返回弱指针 [实际上不完全是因为 __px 是一个 const 指针,所以您需要一个额外的间接寻址来丢失 const,或者如果您无论如何都是脏的,扔掉它!].将其全部包装在一个类中,然后从中派生而不是 enable_shared_from_this:

#if >= C++17
using enable_shared_from_this_c17 = enable_shared_from_this;
#else

template<typename _Tp>
enable_shared_from_this_c17: public enable_shared_from_this<_Tp>
{

weak_ptr<_Tp> weak_from_this()
{
weak_ptr<_Tp> rv; auto rv2 = &rv;
__enable_shared_from_this_helper(*(const __shared_count<>*)nullptr, this, &rv2);
return rv;
}
}
#endif

现在,您在 c++14 中实现了 weak_from_this()。是的,这是一个令人讨厌的污点,但直到您升级到 17 时才会出现这种情况。

或者,只捕获异常!

第三种选择 - 添加一个实例化模板包装器,在包装 shared_from_this() 的 enable_shared_from_this 的包装器中设置“constructed”,因此它会失败,直到设置了 constructed 标志。

enable_shared_from_this
safe_shared_from_this
your interfaces
your_implementation
constructed<your_implementation>

当然,如果在没有立即分配给 shared_ptr 的情况下使用类,这是不完美的。

关于c++ - 我可以检查 `shared_from_this` 是否可以安全调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50758712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com