你这个设计恐怕走偏了,类似这样的问题从本质上来说是没法避免的。比如说某个 Active 的派生类这么实现:
代码:
class VectorPrinter : public Active< string >
{
private:
vector<string> _v;
VectorPrinter(const vector<string>& v) { copy(v.begin(), v.end(), back_inserter(_v)); }
virtual void activity(void)
{
for (vector<string>::iterator i=_v.begin(); i!=_v.end(); ++i) {
cout << *i << endl;
_sleep(1000);
}
}
};
看起来没太大问题吧?但如果你构造了一个 VectorPrinter 的对象并调用了它的 activate 函数,那么在对应的线程结束之前,你绝对不能析构这个 VectorPrinter 对象,即使你的基类析构函数中调用了 join 也一样:因为运行 VectorPrinter::activity() 函数的线程需要访问 VectorPrinter 中的 _v 成员,但在调用基类析构函数执行 join 之前,派生类的析构函数已经执行了,_v 成员已经被析构了。