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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[C++11]_[初级]_[使用std::move移动对象资源]
场景: C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了. C++11 提供了std::move 函数来把左值转换为xrvalue, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了. 对指针类型的标准库对象并不需要这么做.
C++11中移动语义(std::move)和完美转发(std::forward)
前言所有的手段都是为了解决已存在的问题。std::move和std::forward是C++11中的特性,是为了解决C++98/C++0x中遗留的问题,虽从理解上来看比较复杂,却是较好的解决手段。左值(lvalue)与右值(rvalue)左值与右值的概念其实在C++0x中就有了。概括的讲,凡是能够取地址的可以称之为左值,反之称之为右值,C++中并没有对左值和右值给出明确的定义,从其解决手段来看类似上
理解std::move是如何工作的
关于右值引用: (1)右值引用通过&&来获得右值引用,一个重要的性质:只能绑定到一个将要被销毁的对象上,因此我们可以自由的将一个右值引用的资源“移动”到另一个对象中。 (2)不能将一个右值引用直接绑定到一个左值上。 (3)左值持久,右值短暂: 考察左值和右值表达式列表,两者区别就很明显了:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的
c++11 函数内部返回对象使用move语义的最佳实践
一句话,直接返回即可,不用任何变化。当启动了c++11选项后,通过函数返回代码没有发生任何变化,但是已经使用了move语义,而不需要之前的NRVO编译器优化技术。下面是stackoverflow上的一个讨论贴,比较有价值:246down voteacceptedFirst examplestd::vector return_vector(void) { std::vector tmp {1
C++ 11 右值引用以及std::move
新类型:          int和int&是什么?都是类型。int是整数类型,int&则是整数引用类型。同样int&&也是一个类型。两个引号&&是C++ 11提出的一个新的引用类型。记住,这是一个新的类型。默念10次吧。如果你记住这个新类型,那么很多疑问都能迎刃而解。并且对《Effective Modern C++》说到的void f(Widget&& w),就很容易明白w是新类型的一
关于c++默认的构造函数、析构函数、拷贝构造函数、move函数
在c++中,当我们定义一个类的时候,如果我们什么都不定义的时候,c++编译器会默认的为我们生成一些函数。 例如定义一个Example类。 class Example{ }; 当我们定义一个Example类的时候,不定义任何操作的时候,c++编译系统将为Example类生成如下默认操作函数:  1. 默认构造函数Example();  2. 拷贝构造函数Example(const Exa
std:move基本用法和理解
场景: C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了.C++11 提供了std::move 函数来把左值转换为xrvalue, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了.对指针类型的标准库对象并不需要这么
让我们一步一步实现一个完整的 String 类:构造、拷贝、赋值、移动和析构
一、引言 我们在面试 C++ 相关岗位的时候,总会遇到这样的笔试面试题: 请你实现一个 String 类 这道题,说简单也简单,说难也难,是一个考察 C++ 基础的非常好的题目。正好在今天,我萌生了一个想法,那就是一步一步,一点一点,从构造析构,到拷贝赋值,再到 C++11 的移动,我们都给这个 String 类加进去,让我们看看,这将是一个怎样的类 :) 让我们先写下这么一段代码...
c++11 move是否真正生效
c++11 move 语义
C++ 拷贝控制:对象移动
左值和右值 一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。 首先要知道什么是左值、什么是右值。C++ Primer 5th P121 4.1.1有说明。TODO:补充右值引用 新标准中的一个最主要的特性是可以移动而非拷贝对象的能力。在某些情况下,对象拷贝后就立即被销毁了,此时使用移动而非拷贝将大幅提升性能。P470 13.6 上面是引入“移动”的原因。“某