2013-01-15 47 views
0

在我的代碼中,工作線程創建對象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

如果可能的話,創建和線程的run()功能銷燬對象的權利。如果對象必須存在於調用線程中(例如Qt喜歡小部件以主線程爲例),然後在線程對象的構造函數中創建它(或將它傳入)並像析構函數中一樣刪除(這假設你的線程在完成後被調用者線程銷燬)。

另外,在發出kill信號後,join()刪除它之前的線程,以確保它完成乾淨。