在我的代码中,工作线程创建对象A,主线程类B析构函数调用工作线程的析构函数,在工作线程的析构函数中删除对象A. 代码就像:
WorkerThread::foo() {
Object *p = new Object;
}
WorkerThread::~WorkerThread {
delete p;
wait();
}
B::~B() {
emit signal();
//this signal is to ask worker thread to quit,
//the signal/slot connection is connect(this, SIGNAL), mWorkerThread, SLOT));
delete mWorkerThread;
}
现在问题是工作线程的其他功能可能仍在使用* p(对象A)。我知道我可以在WorkerThread析构函数中添加互斥锁。但有时我收到错误消息,说不应该在没有创建它的线程中删除对象A.这是否意味着我需要在工作线程中删除* p?我该如何运作?使用另一个信号和插槽?
谢谢,
答案 0 :(得分:0)
如果可能,请在线程的run()
函数中创建并销毁对象。
如果对象必须存在于调用线程中(例如,Qt喜欢小部件存在于主线程上),那么在线程对象的构造函数中创建它(或传入它)并像在现在一样在析构函数中删除(这个)假设你的线程在完成后被调用者线程销毁了。)
此外,在删除之前发出kill信号,join()
线程,以确保它完全干净。