2015-08-16 28 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' –