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个回答

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
std::move与移动构造函数
看到代码里面有用到std::move,翻资料、写demo,搞了一上午算是搞明白了。 Object a; 调用默认的构造函数 情况1: Object b = a; Object b (a); if (有重写的拷贝构造函数) { 调用重写的拷贝构造函数; } else { 调用默认的拷贝构造函数; } 情况2:...
关于std::move与右值引用
关于std::move与右值引用 先来看一个例子class A { public: A(){ arr_ = new int[10](); len_ = 10; } A(A && a) { arr_ = a.arr_; a.arr_ = nullptr; len_ = a.len_; }
[C++11]_[初级]_[使用std::move移动对象资源]
场景: C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了. C++11 提供了std::move 函数来把左值转换为xrvalue, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了. 对指针类型的标准库对象并不需要这么做.
std::thread对象移动
//临时对象转移,必须隐式调用 t1=std::thread(some_other_function);std::thread t3; t3=std::move(t2);//显式调用t1=std::thread(some_other_function); t1=std::move(t3);//多次赋值将使程序崩溃//临时对象转移,必须隐式调用 t1=std::thread(some_other_f...
std::move何时发生真正的移动
 c++11增加了一个新的类型--右值引用,而移动语义是通过右值引用来匹配临时值的.  尽管不能将一个右值引用直接绑定到一个左值上,但可以通过move将一个左值显示的转换为对应的右值引用类型  move,这是一个具有迷惑性的名字,实际上,move函数并没有真正的移动对象,他只是将该对象从一个左值转换为一个右值   #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; #include &amp;amp;amp;...
新手问题,关于STD
#include rnusing namespace std;rnclass Arnrnprivate:rn int m;rn rnpublic:rn rn A(int i):m(i)rn A operator+(A&a)return m+a.m;rn friend ostream& operator<<(ostream& ,const A&);rn;rnostream& operator<<(ostream& out,const A&d)out<
C++右值引用问题:关于std::move
假设有如下代码:n```n int &&r1=42;n int &&rr2=rr1;//errorn int &&r3=std::move(rr1); //okn```n 这里在调用move函数之后是否可以继续使用rr1变量,或者说下面的代码是否是合理的。nn```n cout<
引用限定符与std::move()的问题
[code=c]class Quoternpublic:rn Quote(const Quote& q) : bookNo(q.bookNo), price(q.price) rn Quote(Quote&& q) noexcept : bookNo(std::move(q.bookNo)), price(std::move(q.price)) rn rn virtual Quote* clone() const & return new Quote(*this); rn virtual Quote* clone() && return new Quote(std::move(*this));rn //这里用std::move的用意是什么?是为了显式调用Quote(Quote&& q)这个构造函数吗?rn//我原以为直接virtual Quote* clone() && return new Quote(*this);rn//就行了,因为有&&引用限定符,说明*this是右值。我说错没?rnrnprivate:rn std::string bookNo;rnrnprotected:rn double price = 10.0;rn;[/code]
std::move做了什么?
std::move将对象标记为可变的右值对象。 A a1; A a2 = std::move( a1 ); 第二行语句将执行移动拷贝构造(move constructor)和移动赋值运算符(move assigment operator)函数: 创建一片大小为sizeof(A)的内存; 将a1中 内容拷贝到这片内存中; a1中的有效内存被销毁。  注意:如果不自定义move-cons...
简单测试std::move
std::move(t),用于指示对象 t 可以“被移动”,即允许从 t 到另一对象的有效率的资源传递。假设将t赋值给t1,即: t1=std::move(t);操作完成后,t的值(内容)给了t1,t本身没有值了。举例: #include <iostream> #include <utility> #include <string>int main(int argc, const char * a
std::move和右值引用
右值引用允许编程人员去避免不必要的内存拷贝,从而提高性能。 我们知道如果一个类A的成员变量中有指针,那么就要考虑深拷贝和浅拷贝了,深拷贝通常要实现下面几个函数: * 构造函数 * 拷贝构造 * 赋值操作符这样做是没问题的,但是会带来一个问题,会造成一些没必要的拷贝,如:std::string str("hello"); str.resize(1024 * 1024 * 100);std::v
什么时候使用std::move
自从c++11出了std::move后都不会使用引用了,不知道什么时候使用引用,什么时候使用std::move,大家说说std::move的使用场景。std::move不就是不用复制嘛,引用也是耶。有点迷糊了。
std的move功能
C++11是新时代的C++亦称为modern C++,是对C++98扩展。C++11旨在手写简便与提高效率。 大量的企业级项目,己经全部用C++11改写了,比如cocos2dx游戏引擎己经全面拥抱C++11。
分配动态内存的问题(新手)
是不是只能对指针动态分配内存?
std::move性能测试和应用范例
string move正确用法与性能测试 直接上代码和运行结果 代码 #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; #include &amp;amp;amp;lt;string&amp;amp;amp;gt; #include &amp;amp;amp;lt;sys/time.h&amp;amp;amp;gt; using namespace std; const int kRunTime = 1000*1000; // 循环次数
C++ 学习(右值引用, std::move)
参考: http://www.cnblogs.com/lebronjames/p/3614773.html#include <iostream> #include <stdio.h> #include <algorithm> #include <stdlib.h> #include <ext/memory> #include <vector> #include <set> #include <st
c++11 之右值引用、移动语义、std::move
c++11引入了右值引用和移动语义(移动构造和移动赋值运算符),可以避免无谓的复制,提高程序性能。1.右值引用右值引用,记为T&amp;amp;&amp;amp;。左值是指表达式结束后依然存在的持久对象,右值是指表达式结束就不存在的临时对象。一个区分左值与右值的便捷方法是对表达式取地址,如果能则是左值,否则是右值。右值包括:非引用返回的临时变量、运算表达式产生的临时变量、字面值、lambda表达式、std::mo...
43.StrVec类:std::move调用移动构造函数的一个实例
自定义一个strvec类,在内存不够,开辟新的内存存放元素的时候(也即是reallocate),使用移动操作!而非拷贝! using namespace std; class strvec { private: static allocator&amp;lt;string&amp;gt;alloc; void chk_n_alloc() { if (size() == capacity()) reall...
成员函数右值引用限定符与std::move()的问题
书上例子是这样的:rn[code=c]virtual Quote* clone() && return new Quote(std::move(*this));[/code]rn我想问的是:rn既然有了&&限定符,说明*this本身就是右值,为何还要std::move(*this)呢?直接return new Quote(*this);不就行了嘛?难道是为了让人一目了然?rn哦对了,书上前面说智能指针比指针好,那么这里为什么不用智能指针呢?rn如rn[code=c]virtual shared_ptr clone() const & return make_shared(*this); [/code]
iTween基础之Move(移动)
iTween基础之Move(移动) 1,五种移动方法;2, 函数的基础属性及用法
c动态内存
在程序中只有运行时才分配内存空间的方法称为动态存储分配。 特点: 1. 在内存的堆中进行; 2. 内存的管理有用户自己管理,动态内存的生存周期有我们自己决定; 3. 动态分配的内存不会自动初始化,需要自己来清零或其他初始化处理;bzero(void* buf, size_t size);创建:void* malloc(size_t size);创建的内存空间放在void*类型的指针对象
各种方式的移动脚本 Move
初版:【Move】【MoveView】 (移动.zip)为demo 1.鼠标滑动控制视野; 2.wasd控制移动,空格跳跃; 3.alt键控制移动和选择的开关,按一次关闭,再按一次打开,如此往复(这是为了避免与视野冲突,需要点击设备时按alt关闭移动和旋转); 4.人物漫游操作现在就是这样,地铁站模型还没贴完材质,所以先用的这个没有材质的。等贴完材质后就可以更换地铁站模型。 【MyMove】 借用了SimpleLOD插件的移动脚本 1、点击了移动键(wasd)的时候,鼠标朝向会激活 2、按住鼠标左键拖动,可激活鼠标朝向 【摄像机移动脚本.txt】 虚拟轴,左右绕对象旋转,上下平视和俯视对象 【MouseOrbit_ForRTS_CSharp】 鼠标左键:类似拖动模型功能 鼠标右键:类似旋转模型功能 鼠标右键:类似模型缩放功能 此脚本实际未对模型进行任何操作,只是操作了摄像机, 仅将此脚本挂在摄像机上即可
【Leetcode283 -移动零 Move Zeroes 】(c语言版)
目录   移动零 测试单元 题目分析 大功告成 移动零 给定一个数组  nums,一个关系编写函数将所有  0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 测试单元 直接用题目中给出的测试用例 int main()...
C——动态内存
c内存结构 1. stack 栈区,有一个最大的大小限制,一般是2M,超过之后会报stack overflow 错误 系统自动管理这块内存,自动分配,自动释放,比如一些局部变量 分配方式 int a[100]; 2. heap 堆区,可以分配系统内存80%的空间; 由程序员自己手动分配,手动释放 分配方式 int *p=malloc(字节数);//malloc 返回任意
c语言中关于动态内存及指针的问题
如何解释如下的程序 :rnrnint **vex_tri;rnint **vRing;rnrnvex_tri=(int **)malloc(100*sizeof(int *));rn vRing=(int **)malloc(100*sizeof(int *));rn for (i=0;i<100;i++) rn vex_tri[i]=(int *)malloc(6*sizeof(int));rn vex_tri[i][0]=0;rn vRing[i]=(int *)malloc(6*sizeof(int));rn vRing[i][0]=0;rn
关于动态内存僵尸进程的问题
一个程序用malloc或者new申请了动态内存,但是没有手动释放,那么这些内存是在该进程成为僵尸进程之前被释放,还是成为僵尸进程之后被释放呢
关于动态内存绘图问题
我想问下,现在有一个接收线程,不断的接收数据,然后要把数据以图形的方式显示在窗体上,我现在想问下rnrn大家的思路,我现在能想到的是每次接收到数据,然后再内存里面重新绘制整个图形贴出来,不知道这样影响速度不rnrn求高手赐教了~~~~~~~~~~~~~~~~~~~~~~~~~~谢谢~
关于动态内存的释放问题
自己写了个合并排序的代码,写成了这个样子,忽然就想,当我在函数外申请的动态内存的指针要作为参数传入函数中,而这个函数又被作为返回值返回,这里需要怎么去释放内存呢?rn求大神指导,代码如下,我在外面申请了N1,N2两个整型数组,我要怎么释放呢rn在merge函数中释放指针A,B可行不可行呢?rnrnclass MergeSort rnpublic:rn int* mergeSort(int* A, int n) rn if (n < 2) return A;rn else rn int m = n/2;rn int *N1 = new int[m];rn for (int i = 0; i < m;i++) rn N1[i]=A[i];rn rn mergeSort(N1,m);rn int *N2 = new int [n - m];rn for (int i = 0; i < n - m; i++)rn N2[i] = A[m +i];rn rn mergeSort(N2,n-m);rn return merge(N1,N2,m,n-m,A);rnrn rn rn int *merge(int * A, int * B,int n1,int n2,int *C) rn int i,j;rn for(i = 0,j = 0; i < n1 && j < n2;) rn if (A[i] <= B[j]) rn C[i+j] = A[i];rn i++;rn rn else rn C[i+j] = B[j];rn j++;rn rn rn for (;i < n1;i++) rn C[i+j] = A[i];rn rn for (;j < n2;j++) rn C[i+j] = B[j];rn rn //函数外申请的动态内存N1,N2可以在这里释放吗?rn //delete A,B;rn return C;rn rn rn // write code herern rn;
新手问题,关于using namespace std
工程是用VC++6.0创建的单文档多视图工程。rn想写一个全局函数,供使用。rn这个函数需要用stringrn于是rn#include rn#include rn#include rn#include rnusing namespace std;rnrnstring fun(long double val)rnrn ....rnrnrn编译有1000多错误,发现是命名空间问题,不懂了?
关于动态内存的问题
#include rnrnusing namespace std;rnrnclass String rnrnpublic:rnString( const char * = 0 );rnString& operator=(const char*);rnrnprivate:rn int _size;rn char *_string;rn;rnrnString& String::operator = (const char *pi)rnrn rn rn rn cout<<"haha"<
关于动态内存的怪异问题
char* ptr;rnif((ptr=(char*)malloc(0))==NULL)rn put("get a null pointer");rnelsern puts("get a valid pointer");rnrn我的测试结果是: 尽管把0传给,但是ptr仍然是有地址的,不知道怎么解释??
请问关于using namespace std问题,新手
我看标准c++说调用标准库时用using namespace std;就可以了rn但是我写的时候就不行,如rn#include rn#include //就这里要出错,rnrnusing namespace std;rnrn问,using namespace std;到底表示什么意思rn还有调用 库为什么不行.rnrnrn
std::map iterator移动问题
[code=c]int main ()rnrn std::map mymap;rn std::map::iterator it;rnrn mymap['b'] = 100;rn mymap['a'] = 200;rn mymap['c'] = 300;rnrn // show content:rn for (std::map::iterator it=mymap.begin(); it!=mymap.end(); ++it)rn std::cout << it->first << " => " << it->second << '\n';rnrn return 0;rn[/code]rnrn问题:it能用++rnrn可以这样用的么?rn例如std::map::iterator it = mymap.begin() + Nrnrn举个例子,我想快速移到第N个.有什么好方法?rnrn
ADO关于Move的问题
请教大家,vc2008使用ADO操作mdb文件,Recordset建立键集游标rnrn调用Recordset->Move(long(9),adBookmarkCurrent)为什么提示异常“使用错误的数据类型”,谢谢
FLEX 关于Move 的问题
使用MOVE的时候,感觉效果很好,不知道能否控制其运动速度?望高人指点,谢谢.rn
Move语义Qt编程 为什么没有 std::move()?
![图片说明](https://img-ask.csdn.net/upload/201610/28/1477626942_637413.png)nn想试一下Move语义然而我的Qt怎么没有std::move()?也没有std::copy()?nnQt版本:nqt-opensource-windows-x86-msvc2015_64-5.7.0nn头文件已经加了n#include n#include n#include
弱智问题:关于move
b1,b2:^byte;(是两个缓冲区)rn应该用move(b1,b2,100);rn还是move(b1,b2,100);
右值引用和std::move 以及std::forward(完美转发)
左值与右值 左值是这样一种表达式,它指向一块物理内存,并允许我们通过运算符&amp;amp;来取得这块内存的地址,而右值则是非左值的表达式。常量和匿名的临时变量都为右值,如函数返回值。 比如:int a=0; //a为左值           string s=&quot;ss&quot;;//s为左值,&quot;ss&quot;为右值           string ss=string(&quot;e&quot;);//ss为左值,string(&quot;e...
求教关于Move()的问题。
C中有如下一段程序:rnmemmove(pdata, bcp_msg->MsgBody.BCP_DATA_IND_T.pData, bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength);rnmemmove(pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength, "\0", 1);rn其中pdata为一指针,bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength返回一个整数。rn如果用Delphi实现,rn是不是应该先在pdata-1处存入bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength设置字符串长度,然后在pdata处拷贝bcp_msg->MsgBody.BCP_DATA_IND_T.pData?rn还是在pdata处拷贝bcp_msg->MsgBody.BCP_DATA_IND_T.pData后再往pdata+bcp_msg->MsgBody.BCP_DATA_IND_T.uiLength写入字符串结束符?rn请高手指教。
转载:C++11尝鲜:std::move和std::forward源码分析
std::move和std::forward是C++0x中新增的标准库函数,分别用于实现移动语义和完美转发。 下面让我们分析一下这两个函数在gcc4.6中的具体实现。 预备知识 引用折叠规则: X& + & => X& X&& + & => X& X& + && => X& X&& + && => X&& 函数模板参数推导规则(右值引用参数部分): 当函数模板的模板参数为T而函数形
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法