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