在 C++ 中,在对象销毁时,派生 cas 析构函数在基类析构函数之前调用。是否可以在派生类销毁时自动通知基类(即调用基类的成员函数)?我可以在派生类析构函数中手动调用基类通知函数,但用户必须始终记住在从基类继承时添加该行,这是我想避免的。
我正在构建一个多线程框架,从两个不同的线程(主线程和生产者线程)访问从类
MyObject
继承的类GeneralObject
的对象。当对象在主线程中被析构时,MyObject
的析构函数被调用,然后GeneralObject
类的析构函数将其自身从有效对象表中删除,其中的多态对象的所有“有效”指针GeneralObject
已存储。这会阻止生产者线程访问不再存在的对象。问题在于,在 MyObject
的析构函数调用和 GeneralObject
的析构函数调用之间的短暂时间内,存储在 valid-object-table 中的指针变成了悬空指针。当然,它会在 GeneralObject
析构函数中被删除,但由于生产者线程可能会尝试在短时间内访问该对象,因此这是不安全的。我需要 GeneralObject
的函数将其自身从表中删除,以便在 MyObject
被销毁时调用。
最底层的派生类需要在您的控制之下。我要做的是这样的:
template <typename T>
struct Wrapper : T
{
using T::T;
~Wrapper() {this->PreDestroy();}
};
那么您必须使用
Wrapper<MyObject>
而不是 MyObject
。为了强制执行这一点,我会为 std::unique_ptr<T>
制作自己的包装器,其中构造它的唯一方法(类似于 std::make_unique()
)将对象强制包装在 Wrapper<...>
中。