我的课继承了多个基础,其中之一是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
所在的存储空间仍然存在吗?
当〜A()和〜B()运行时,我可以确定C所在的存储仍然存在吗?
否,基类的顺序无关紧要。即使使用(或不使用)enable_shared_from_this也无关紧要。
[销毁C对象时(无论发生什么情况),~C()
将同时被称为[[before] ~A()
和~B()
,因为这是基本析构函数的工作方式。如果您尝试在两个基本析构函数中“重构” C对象并访问其中的字段,则这些字段将已经被销毁,因此您将获得未定义的行为。
enable_shared_from_this<T>
继承而获得引用计数器,则首先为整个结果对象分配内存,包括一般的基数和基数[C0 ]。在最后一个所有者(也就是shared_ptr)放弃所有权之前,不会破坏该对象。那时〜enable_shared ...,〜B和〜A将在〜C之后运行。直到最后一个析构函数〜A运行之后,仍可保证完整分配的内存在那里。运行〜A之后,一次刷新即可释放完整的对象存储器。因此,回答您的问题:当〜A()和〜B()运行时,我可以确定C所在的存储仍然存在吗?
是的,尽管您不能合法访问它,但是为什么要知道呢?您想避免哪个问题?