我有一个需要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_cast
或dynamic_pointer_cast
将shared_from_this()
的结果转换为指向派生类的指针。
关于c++ - 有关shared_from_this的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5232712/