2 u010984956 u010984956 于 2016.05.06 16:51 提问

c++新手:关于std::move()移动对象与动态内存的问题

c++primer(第5版)中的一段程序:(P561)

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

书上解释说该右值引用函数将自身移动到新数据中。

疑问:
变量应该保存在栈内存中,而new动态分配的内存应当保存在堆内存中。这样的话,使用std::move()右值引用来将变量“移动”到动态内存中应当没有意义。

 #include <memory>
#include <iostream>
using std::cout;
using std::endl;
using std::shared_ptr;

 int main()
{
    int ax = 0, bx = 0;
    cout << &ax << " " << &bx << endl;//#1 007EFE74 007EFE68
    shared_ptr<int> x(new int(ax));
    shared_ptr<int> y(new int(std::move(bx)));
    cout << x.get() <<" "<< y.get()<<endl;//#2 0092FDB8 0092FF98
    return 0;
}

我写了一段代码验证也确实如此:
两个cout表明两个变量确实被重新拷贝到了堆内存中

请问动态内存是否是 只能拷贝不能移动,或者是我理解错了?

1个回答

oyljerry
oyljerry   Ds   Rxr 2016.05.09 20:01

移动主要发生在临时对象复制到新对象的时候就不需要copy。而是直接数据移动。所以主要是右值对象发生move

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!