2015-08-16 54 views
2

所以有兩件事我不確定。std ::移動堆棧對象(到不同的線程)

  1. 如果我做這樣的事情:

    void sendToDifferentThread(SomeClass &&obj); 
    ... 
    { 
        SomeClass object; 
        sendToDifferentThread(std::move(object)); 
    } 
    

會發生什麼?如果在堆棧中創建了object,那麼如何才能創建一個副本?因爲當我們走出封閉範圍時,堆棧中的所有東西都被銷燬了?

  • 如果我做這樣的事情:

    SomeClass object; 
    doSomethingOnSameThread(std::move(object)); 
    
  • 如果我這樣做在當前範圍內會有些事情發生後object什麼?它被「移走」到某種其他功能,當前功能在某種程度上「失去」它的所有權嗎?

    +1

    如果您將引用綁定到某個對象,則確保該對象在任何人使用該引用時都處於活動狀態。 –

    回答

    3

    在C++中構造對象時,會同時分配內存。如果構造函數運行完成(不拋出),那麼該對象是「活着的」。在某些情況下,如果它是一個堆棧對象並超出範圍,或者它是一個堆對象,並且您調用delete,則會調用其析構函數,並釋放原始內存,然後該對象將「死」。 C++ 11 std :: move/move構造函數不會更改任何這些。移動構造函數的作用是爲您提供一種「破壞性」複製對象的方式和簡單語法。

    例如,如果您移動從std::vector<int>構建,而不是閱讀所有的int S和複製它們,將複製指針和大小,而不是算到新的載體,和老指針設置爲nullptr和大小到0(或者可能分配一個最小尺寸的(小)新矢量......取決於實現)。基本上,當你從某些東西移動到某個「有效」,「活着」狀態時 - 在你移動它之後它不會「死掉」,並且析構函數仍然會在以後調用。它沒有「移動」,因爲它仍然是一樣的生活,現在它只是「記憶中的其他地方」。當你從一個對象「移動」時,從C++的角度來看肯定有兩個不同的對象,我認爲如果你試圖把它看作只有一個對象在那種情況下存在。

    +0

    所以實際上在內存中有兩個不同的對象,但它們_conceptually_代表相同的實體(共享相同的狀態)? (這是移動構造函數的責任,以確保?) –

    +0

    是的,至少我認爲這是移動構造函數的作用,它就像複製構造函數,但是當它複製它時會「竊取」資源。所以最初的矢量結果是空的。不是*死了*,它仍然會在晚些時候發生,但現在它是貧窮的。 IIUC在C++ XX中總是如此,例如,如果我在類函數的某個函數中創建了一個局部變量,那麼當我們離開該函數時,即使拋出異常,也會使用相同的「this」指針值調用該類的那個類。 (除非像std :: terminate是被涉及到的東西) –

    +1

    等等,它們不共享相同的狀態,如果一個對象是移動構造的,那麼(很有可能)只有新構造的對象具有「內容」 std :: unique_ptr' –