有个网络通信类,主要执行是在另外一个线程。但是在线程执行的时候,对象很可能已经析构了。
所以接口设计为
class PostCallBack:
public base::RefCountedThreadSafe<PostCallBack>
{
public:
virtual void ProcessData(string data,string flag)=0;
virtual BrowserThread::ID ProcessDataThreadID(string flag)=0;
private:
friend class base::RefCountedThreadSafe<PostCallBack>;
protected:
virtual ~PostCallBack(){}
};
外部使用的时候用
scoped_refptr包装实现接口的类来调用功能。
会遇到如下问题:
1.原对象的接口指针暴露在多处,析构的地方千奇百怪。
2.UI框架中的元素的生命是交给父元素管理的,用scoped_refptr会在生命周期上出错。
3.继承自单例模板的时候和单例模板的生命周期冲突了。
解决方法如下:
1.不在暴露多的类对象上使用该接口,转由某个其他对象代理使用。
2.在使用该接口的地方强制UI元素自己管理自己的对象。父元素在销毁子元素的时候进行判断子元素的生命周期是否进行释放。
3.添加单例模板的建造trait,使得Delete的时候转由引用计数管理生命周期。