我有这样一个类:
class Base
{
public:
Base() { task_ = std::thread(&DexHandlerBase::running_task, this); }
virtual ~Base(){ /*send signal to task_ to stop then */ task_.join();}
protected:
virtual int some_check(int) = 0;
private:
void running_task() { some_check(123); }
std::thread task_;
}
class Derived
{
protected:
int some_check(int) override; //here I use my_data
private:
std::string my_data = "test";
}
程序关闭时有时会产生异常.
我的猜测是derived的默认析构函数被调用,Derived默认析构函数运行,然后my_data
被析构。然后基类析构函数被调用,它通知线程它将被析构并等待。但线程正在运行一个调用虚函数的任务,此函数使用不再存在的my_data。
所以从基类到派生类的数据有一个依赖关系。我不想把数据上移,而且函数必须是虚的。我应该重写每个派生类中的析构函数,这样它就关闭了线程,还是有更好的设计?
1条答案
按热度按时间fhity93d1#
我在基类中运行异步操作时遇到过类似的问题,很可能是在调用
Derived
的析构函数后,task_
试图调用纯虚的virtual int some_check(int) = 0;
,所以是非法的,因为Derived
已不存在。您应该确保您的Derrived::~Derived()
停止了/*send signal to task_ to stop then */
的asic操作。实现protected
Base::stopTask()
并在Derived
DTor中调用它。