c++ - 使用 "new ClassType(std::move(/*class_object*/))"在 freestore 中构建对象

标签 c++ c++11 new-operator move-semantics move-constructor

初学者问题:

Class Quote {
    public:
    /* ..... */

    virtual Quote* clone() const & {return new Quote(*this);}

    virtual Quote* clone() && {return new Quote(std::move(*this));} // (***)

    /* ..... */
}

new 分配的对象在自由存储中。 *this 是调用 clone() 的任何对象,不一定是动态分配的对象。

如果 move 对象和 move 对象位于不同的内存区域, move 机制如何工作?或者也许他们从来没有真正在不同的领域,我错过了什么?

据我所知, move 构造函数创建了新的开销,这些开销链接到移出对象的数据/内存部分。数据本身不会 move/更改。在上述情况下这是如何工作的?如果它以相同的方式工作,那么在 new 运行之后,我们不会有一个动态分配的对象位于自由存储之外(无论 *this 位于?)这是否由 std::move() 以某种方式解决?我不太确定 std::move() 是如何/为什么工作的,除了它会强制返回对命名对象的右值引用,从而可以从该对象 move 对象。

最佳答案

From what I understand, the move constructor creates new overheads that link to the data/memory part of the moved-from object. The data itself is not moved/changed.

不是真的。一个典型的 move 构造函数((我强调典型的因为 move 构造函数真的可以做类编写者想要它做的任何事情)将“窃取”另一个对象远程拥有的资源< em>(例如动态分配的数组),通过重新分配句柄(例如指向动态分配的数组的指针)

当我说资源被远程拥有时,我的意思是它实际上不是类的数据成员。然而,句柄类的数据成员。句柄指的是资源。移至对象和移自对象具有不同的地址和数据成员。他们的数据能够有效地 move ,因为它实际上不是类的一部分,它是由句柄引用的。与资源不同,句柄很小,复制起来也很便宜。 “move ”实际上是将句柄从源对象复制到目标对象,然后使源对象中的句柄无效,使其析构函数不会破坏资源。

How does the move mechanism work if the moved-from and moved-to objects are in different memory areas?

(我再次说的是典型 move 构造函数)这是无关紧要的。无论它们恰好存储在哪里,它们仍然具有相同的内存布局。句柄修改完全相同。当 move 到对象的析构函数被调用时,资源将被释放(除非该对象也被 move )。这意味着当对象超出范围时,如果它在堆栈上,或者当 delete 在指向它的指针上调用时,如果它在自由存储上。 (还有其他的可能性,但这两种显然是最常见的)

关于c++ - 使用 "new ClassType(std::move(/*class_object*/))"在 freestore 中构建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19997369/

相关文章:

c++ - gcc-4.0.0-8 和 gcc-4.3.2 的区别

c++ - 为什么 C++11 允许将局部变量声明为 thread_local?

c++ - 除了分配和 ctor 调用之外,C++ new 运算符还做什么?

javascript - 我们可以在使用 "new"运算符创建对象时省略括号吗?

c++ - C++0x 仍然可以使用全局运算符 new 显式分配吗?

c++ - 如何动态地为 Vector<Point> 分配内存?

c++ - 对于模板 : error C4430: missing type specifier - int assumed. 注意:C++ 不支持 default-int

c++ - 为什么 decltype 在这里工作,但不是 auto?

c++ - 判断静态初始化是否结束

c++ - use-defined 转换为数组引用