shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类相关的知识,希望对你有一定的参考价值。
[我试图了解我对shared_ptr
和shared_from_this()
的工作方式以及内存分配的工作方式是否是最新的了解。
以下是我的课程:
class Component : public enable_shared_from_this <Component>
{
public:
Component() :enable_shared_from_this(){}
};
class DerivedComponent : public Component
{
public:
DerivedComponent()
{}
void tryDerivedShared()
{
auto sptr1 = shared_from_this();
if (this == sptr1.get())
std::cout << "Both have same starting address";
}
private:
std::vector<int> myVector;
};
int main()
{
auto sptr = make_shared<DerivedComponent>();
sptr->tryDerivedShared();
}
当我从基类派生时,我了解的是,首先为基分配内存,然后为派生分配内存。因此,当我执行auto sptr1 = shared_from_this();
时,会发生什么事shared_ptr
返回给基类Component的对象。并且由于基数是Derived类的内存的一部分,因此this == sptr1.get()
的值为true
,因为它们两个都返回它们指向的obj的起始内存。基本上,分配的内存类似于| Base | Derived |。 shared_from_this()
返回仅指向Base对象的shared_ptr
,即| Base |。内存块。
我的理解正确吗?
将这些类视为结构可能会更容易。仅您的基类为空,因此可能不是最佳示例。
struct Component
{
};
当您派生时,实际上是将字段添加到结构中,但是您可能希望以这种方式查看它:
struct DerivedComponent
{
struct Component component_;
std::vector<int> myVector;
};
因此,您是正确的,当您分配DerivedComponent
时,Component
(或&obj.component_
)的地址都相同,这就是为什么您可以在两者之间使用static_cast<>()
。
变得更复杂的地方是当您从许多类派生时,尤其是使用virtual
关键字时。另一方面,拥有虚函数并不太复杂,它会在开始时添加一个虚表指针,但是就您所担心的隐藏指针而言。
enable_shared_from_this()
不会更改该概念。它只是向Component
结构添加了一个弱指针。因此Component
类看起来更像这样:
struct Component
{
struct enable_shared_from_this shared_;
};
以上是关于shared_from_this()如何在派生类中工作,该派生类继承自从enabled_shared_from_this继承的基类的主要内容,如果未能解决你的问题,请参考以下文章