检测基类的派生类破坏

问题描述 投票:0回答:1

问题

在 C++ 中,在对象销毁时,派生 cas 析构函数在基类析构函数之前调用。是否可以在派生类销毁时自动通知基类(即调用基类的成员函数)?我可以在派生类析构函数中手动调用基类通知函数,但用户必须始终记住在从基类继承时添加该行,这是我想避免的。

背景

我正在构建一个多线程框架,从两个不同的线程(主线程和生产者线程)访问从类

MyObject
继承的类
GeneralObject
的对象。当对象在主线程中被析构时,
MyObject
的析构函数被调用,然后
GeneralObject
类的析构函数将其自身从有效对象表中删除,其中
的多态对象的所有“有效”指针GeneralObject
已存储。这会阻止生产者线程访问不再存在的对象。问题在于,在
MyObject
的析构函数调用和
GeneralObject
的析构函数调用之间的短暂时间内,存储在 valid-object-table 中的指针变成了悬空指针。当然,它会在
GeneralObject
析构函数中被删除,但由于生产者线程可能会尝试在短时间内访问该对象,因此这是不安全的。我需要
GeneralObject
的函数将其自身从表中删除,以便在
MyObject
被销毁时调用。

c++ multithreading inheritance
1个回答
1
投票

最底层的派生类需要在您的控制之下。我要做的是这样的:

template <typename T>
struct Wrapper : T
{
    using T::T;
    ~Wrapper() {this->PreDestroy();}
};

那么您必须使用

Wrapper<MyObject>
而不是
MyObject
。为了强制执行这一点,我会为
std::unique_ptr<T>
制作自己的包装器,其中构造它的唯一方法(类似于
std::make_unique()
)将对象强制包装在
Wrapper<...>
中。

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