u010984956 2016-05-06 08:51 采纳率: 0%
浏览 2841

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 2016-05-09 12:01
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料