主要和深浅拷贝有关
当类对象中包含指针,指针会通过new的方式从堆中申请的空间,在销毁时需要释放对应的内存空间
在调用拷贝构造函数时,对于该指针的拷贝,需要通过深拷贝,即在堆中申请内存的方式来构造一个全新的类对象,避免两个对象的指针指向同一块儿内存区域(浅拷贝)
如果被拷贝的对象即将被释放,或者说是临时对象,我们就可以优化一下这个流程,将新对象的指针指向该临时对象的堆空间,并将该临时对象的指针置空,即一种挪用的思想,又回归了浅拷贝
移动语义就诞生了,也就是浅拷贝
移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源移为已用
class demo{
public:
demo():num(new int(0)){
cout<<"构造函数"<<endl;
}
demo(const demo &d):num(new int(*d.num)){
cout<<"深拷贝构造函数"<<endl;
}
//添加移动构造函数
demo(demo &&d):num(d.num){
d.num = NULL;
cout<<"移动构造函数"<<endl;
}
~demo(){
cout<<"析构对象"<<endl;
}
private:
int *num;
};
demo get_demo(){
return demo();//函数栈空间构造临时对象并申请堆空间内存,返回的对象还需要进行一次深拷贝
}
int main(){
demo a = get_demo();//再调用一次深拷贝,将返回的对象拷贝给a
return 0;
}
标签:对象,语义,C++,内存,引入,拷贝,移动,指针
From: https://www.cnblogs.com/lxzbky/p/17064320.html