我有一个需要shared_ptr<MyClass>的函数。
memfun的某些成员函数MyClass中,我需要将this传递给该函数。但是如果我写

void MyClass:memfun()
{
   func(shared_ptr<MyClass>(this))
}

我假设调用结束后,引用计数将达到0,并且尝试将this销毁,这很糟糕。

然后我想起了带有函数enable_shared_from_this的此类shared_from_this

所以现在我将使用以下内容:
class MyClass: public enable_shared_from_this<MyClass>
{
    void MyClass:memfun()
    {
       func(shared_from_this());
    }
};

问题是:

1)在不衍生自enable_shared_from_this的情况下使用功能是绝对不可能的吗?
2)enable_shared_from_this派生出来是否意味着在具有自动存储持续时间的对象上调用memfun会导致不良后果?例如。
 int main()
 {
    MyClass m;   //is this OK?
    m.memfun();  // what about this?
 }

3)如果我从MyClass派生,是否将正确继承enable_shared_from_this功能,还是需要再次派生?那是,
class MyCoolClass: public Myclass
{
   void someCoolMember
   {
      someCoolFuncTakingSharedPtrToMyCoolClass(shared_from_this());
   }
}

这个可以吗?还是下面的正确?
 class MyCoolClass: public Myclass, public enable_shared_from_this<MyCoolClass>
    {
       void someCoolMember
       {
          someCoolFuncTakingSharedPtrToMyCoolClass(enable_shared_from_this<MyCoolClass>::shared_from_this());
       }
    }

首先十分感谢。

最佳答案

1)这取决于您“可以执行此操作”的含义。您始终可以从原始指针(例如shared_ptr)构造this,但它不会与从原始指针单独构造的另一个shared_ptr实例共享引用计数。因此,您将需要在一个或其他实例上使用自定义删除器,以避免重复删除,但是除非格外小心,否则由于对象是通过一个对象删除但仍然可以从另一个对象访问的,因此最终可能会挂起shared_ptr实例。
shared_from_this使您能够保证,如果您的对象有一个shared_ptr实例,则可以构造另一个实例而不用复制第一个实例,并且这些实例将共享引用计数。您可以通过将weak_ptr存储为类成员,并在首次为对象分配shared_ptr时设置该值来实现此目的。

2)调用shared_from_this()要求至少已经有一个shared_ptr实例指向您的对象。如果在没有带有自定义删除器的shared_ptr实例的自动对象上使用它,则可能会发生不良情况。

3)如果您从您的类派生,那么enable_shared_from_this功能将为您提供基类的shared_ptr(从enable_shared_from_this派生的基类)。然后,您可以使用static_pointer_castdynamic_pointer_castshared_from_this()的结果转换为指向派生类的指针。

关于c++ - 有关shared_from_this的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5232712/

10-10 21:29