C++移动语义的引入目的

主要和深浅拷贝有关

当类对象中包含指针,指针会通过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;
}

posted @ 2023-01-22 11:19  ecnu_lxz  阅读(25)  评论(0编辑  收藏  举报