我想使用shared_from_this()从通过引用传递的对象中获取std::shared_ptr。但是,我想对可能不在共享指针中或什至无法动态分配的对象保持鲁棒性。

有没有一种方法可以在调用潜在的未定义行为enable_shared_from_this之前检查给定对象(从shared_from_this()继承并通过引用传递)是否由共享指针管理?

最佳答案

您可以实现自己的具有所需语义的make_sharedshared_from_thisenable_shared_from_this。实现您要求的语义并不困难:

  • 该类应为其模板化的类的实例保存一个weak_ptr
  • make_shared实现应从首先创建的shared_ptr初始化弱指针。
  • shared_from_this应该尝试锁定弱指针,如果失败,则返回一个空的shared_ptr

  • 另外,如果weak_from_this在您的平台上可用(这是C++ 17功能),则可以使用它。

    但是,正如其他人所说,似乎很难相信这确实是解决您遇到的任何问题的最佳解决方案。需要shared_from_this起作用的情况必须与shared_from_this起作用的情况完全一致。很难想象是这样的用例。

    10-08 07:55