必须enable_shared_from_this是第一个基类吗?

问题描述 投票:8回答:2

我的课继承了多个基础,其中之一是std::enable_shared_from_this。必须是第一基地吗?

假设以下示例代码:

struct A { ~A(); };
struct B { ~B(); };
struct C : A, B, std::enable_shared_from_this<C> {};

std::make_shared<C>(); 

~A()~B()运行时,我可以确定C所在的存储空间仍然存在吗?

c++ c++11 inheritance multiple-inheritance enable-shared-from-this
2个回答
2
投票

当〜A()和〜B()运行时,我可以确定C所在的存储仍然存在吗?

否,基类的顺序无关紧要。即使使用(或不使用)enable_shared_from_this也无关紧要。

[销毁C对象时(无论发生什么情况),~C()将同时被称为[[before] ~A()~B(),因为这是基本析构函数的工作方式。如果您尝试在两个基本析构函数中“重构” C对象并访问其中的字段,则这些字段将已经被销毁,因此您将获得未定义的行为。


-1
投票
如果创建类型为C的对象c,具有基数A,B和通过从基数enable_shared_from_this<T>继承而获得引用计数器,则首先为整个结果对象分配内存,包括一般的基数和基数[C0 ]。在最后一个所有者(也就是shared_ptr)放弃所有权之前,不会破坏该对象。那时〜enable_shared ...,〜B和〜A将在〜C之后运行。直到最后一个析构函数〜A运行之后,仍可保证完整分配的内存在那里。运行〜A之后,一次刷新即可释放完整的对象存储器。因此,回答您的问题:

当〜A()和〜B()运行时,我可以确定C所在的存储仍然存在吗?

是的,尽管您不能合法访问它,但是为什么要知道呢?您想避免哪个问题?

© www.soinside.com 2019 - 2024. All rights reserved.