【发布时间】:2016-09-11 03:32:55
【问题描述】:
我想知道我对 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 返回给基类组件的对象。而且由于基类是 Derived 类的内存的一部分,this == sptr1.get() 的值是true,因为它们都返回了它们指向的 obj 的起始内存。
基本上分配的内存就像 |Base|Derived| shared_from_this() 返回一个 shared_ptr 仅指向 Base 的对象,即 |Base|一大块内存。
我的理解正确吗?
【问题讨论】:
-
sptr1.get() 返回一个
Component *,this是一个DerivedComponent *。比较运算符只能比较指向相同类型的指针,并且由于DerivedComponent *可以强制转换为Component *,所以会发生这种情况,并且您最终会得到相同的指针值。相等比较真的和shared_from_this()无关。 -
我明白你的意思。谢谢!
-
如果你看
this和sptr1.get()的值是一样的,这意味着sptr是DerivedComponent创建的Component obj上的shared_ptr,它们共享相同的起始地址.我说的对吗? -
这是错误的:“当我从基类派生时,我的理解是先为基类分配内存,然后再为派生分配内存”。任何对象都有一个确切的大小:所有数据成员的组合大小(从基数到派生数)。
标签: c++ inheritance shared-ptr