2014-06-19 49 views
1

在範圍內,我創建一個包含線程的對象。線程被分離到對象的C-tor中。最後,我刪除了這個對象,但是這個線程在關聯的對象內存被釋放後繼續保持着。分離的線程是否保存了對象副本,還是隻引用了程序堆棧,這些程序堆棧會被進一步刪除?C++分離線程在關聯對象被刪除後繼續工作

struct test_detach { 
    test_detach() 
    : thr_(&test_detach::loop, this) { 
     thr_.detach(); 
    } 

    void loop() { 
     while(true) { 
      cout << "loop test" << endl; 
      std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
     } 
    } 

    std::thread thr_; 
}; 

int main() 
{ 
    { 
     test_detach *test = new test_detach; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 

     delete test; 
    } 
    cout << "Sleep" << endl;; 
    std::this_thread::sleep_for(std::chrono::seconds(3)); 

    cout << "Finish!" << endl;; 

    return 0; 
} 

程序輸出:

loop test 
loop test 
Sleep 
loop test 
loop test 
loop test 
loop test 
loop test 
loop test 
Finish! 
+0

您應該聲明不訪問任何*類成員爲** static **的成員函數。現在,它還提供了爲什麼線程可以繼續運行並且不關心你刪除了該對象的見解。線程將自動停止的概念只是錯誤的。 –

回答

1

那麼線程不斷上走,直到節目結束。您的線程不使用特定test_detach結構的任何數據字段,因此不存在SEGFAULT。但是,如果在結構中添加成員變量並嘗試從結構爲主線程的delete d之後的分離線程訪問它,則可能會導致SEGFAULT /未定義行爲等。test_detach結構位於堆上。它不會被複制到任何地方,這就是點。但是:

void loop() { 
    int x = 0; 
    while(true) { 
     cout << "loop test, x: " << x++ << endl; 
     std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
    } 
} 

將正常工作,因爲x位於爲特定線程維護的堆棧上。

+0

嗯,我觀察到堆棧和堆中使用test_detached對象的相似行爲(如上面的代碼中所示)。所以,關鍵是**不能**在被釋放的對象內存之後使用的要刪除的類成員。謝謝! – kemono

相關問題