2017-08-28 69 views
2

下面是我們使用的示例。可拆卸螺紋結束操作時取消內存分配

class CustomThread 
{ 
public: 
    CustomThread(const std::wstring &id1) 
    { 
     t = new test(id1); 
    } 
    ~CustomThread();   

    void startThread() { 
     std::cout << "Do threading Operation here....." << std::endl; 
    } 

private: 
    std::wstring id; 
    test *t; 
}; 


int main() 
{ 
    for (int i = 1; i < 100; i++) 
    { 
     std::wstring id = L"1"; 
     CustomThread *ct = new CustomThread(id); 

     boost::thread new_thread; 
     new_thread = boost::thread(& CustomThread::startThread, ct); 
     new_thread.detach();   
    } 

    // sleep for 100 second - to complete the thread task.... 
    sleep(100); 
    return 0; 

} 

我創造了可拆卸線程,我想開始100拆卸螺紋。 在這裏,我們正在做new CustomThread 100次並分配內存。線程完成操作後會自動刪除嗎? 你能指導如何釋放與上面​​的例子分配的內存?

+2

如果你調用'new',你**必須調用'delete'。這是規則。 – NathanOliver

+0

這是真的。但在這裏,我們不知道何時可拆卸螺紋完成其操作。所以我們什麼時候應該叫刪除? – Neel

+2

C++中的內存管理技巧是永遠不要使用'new'。 – nwp

回答

2

這裏有幾個問題。首先,由於CustomThread獲取資源需要遵循rule of three

現在,讓我們看看你的設計。你動態地分配一個CustomThread,這樣它就不會在for循環結束時被銷燬,並且會持續到線程的生命週期。這裏的問題是,你不知道何時刪除類,即使你還沒有指針來調用刪除它。你可以存儲這些指針,但是你仍然有可能在線程完成之前刪除對象。我們需要做的是以某種方式將線程和對象結合在一起,以便在線程完成運行後知道對象被銷燬。我們可以用輔助函數來做到這一點。如果我們有

void thread_runner(std::wstring param) 
{ 
    CustomThread ct(param); 
    ct.startThread(); 
} 

然後我們可以調用這個函數中,而不是像

for (int i = 1; i < 100; i++) 
{ 
    std::wstring id = L"1"; 
    boost::thread new_thread; 
    new_thread = boost::thread(&thread_runner, id); 
    new_thread.detach();   
} 

現在CustomThread對象自動清理循環,你不必擔心何時何地調用delete(假設你的類有一個適當的析構函數或者你切換到RAII指針類型)。

+0

並且應該在CustomThread的析構函數中或在startThread方法中銷燬「test」。 – Hafnernuss

+0

析構函數的目的是釋放對象可能獲得的資源。因此,它通常是放置刪除的適當位置。鑑於到目前爲止的代碼示例,析構函數明確地說明了我將刪除測試的位置。在構造函數中新建它,在析構函數中刪除它。 – Darinth