美文网首页
C++ 浅拷贝和深拷贝

C++ 浅拷贝和深拷贝

作者: izheer | 来源:发表于2022-05-13 11:19 被阅读0次
浅拷贝
 是栈区中的对象引用都是指向同一个堆区的空间内存。

 注意:此时栈区的对象多次被释放,引发同一个内存地址重复释放的错误。
深拷贝
 在堆区开辟多个内存空间,让赋值的引用对象指向不同的堆区内存地址。
场景如下

A、栈区中,子函数return 对象,进行赋值操作;B、栈区中,传递对象给子函数进行传递引用。

注:默认的拷贝构造函数里使用的是浅拷贝:在栈区先构建新地址,然后进行赋值。

//存在类 Student
class Student{
    Student(){}
    Student(char * name){
       // TODO: name成员属性在堆内存开辟空间了
       this->name = (char *)malloc(sizeof(char * 10)); 
       strcpy(this->name,name);
    }
    Student(const Student & stu){
        //自定义拷贝构造函数
        
        //3、TODO:深拷贝: 给在堆区的成员属性,重新开辟内存空间
        this->name = (char *)malloc(sizeof(char * 10)); //name成员属性在堆内存开辟空间了
        strcpy(this->name,name);
    }
};
Student getStudent(){
    Student stu("name");
    return stu;
}
Student setStudent(Student stu){
    count<< &stu<< endl;
}
void main(){
  // 1、 此 = 等号赋值操作程序执行流程:1、getStudent子函数里先执行Student的构造函数,然后执行拷贝构造函数返回栈区中新的地址引用给stu1,最后getStudent弹栈调用析构函数释放旧地址;
   Student stu1 = getStudent();
   
    // 2、此 参数传递 操作程序执行流程:1、stu2先执行Student的构造函数,然后执行拷贝构造函数返回栈区中新的地址引用给setStudent,最后setStudent弹栈调用析构函数释放新地址;
   Student stu2;
   setStudent(stu2);
}

以上代码案例,若拷贝构造函数中不进行深拷贝,则在mian函数中 student对象多次赋值,程序执行后,setStudent()弹栈、main()弹栈时都会出现同一个内存被释放多次的错误;

总结:一旦成员属性涉及堆内存空间,一定需要深拷贝。

问题bug:多次重复释放同一内存地址的错误的;解决方法:对于在堆区的成员属性,在自定义拷贝构造函数中重新开辟内存地址,如:

    this->name = (char *)malloc(sizeof(char * 10));
    strcpy(this->name,name);

相关文章

  • [C++之旅] 15 深拷贝与浅拷贝

    [C++之旅] 15 深拷贝与浅拷贝 拷贝构造函数分为深拷贝和浅拷贝两种方式 浅拷贝只是将被拷贝的对象的成员直接赋...

  • c/c++/c++11 浅拷贝和深拷贝

    目录 1 c++拷贝 1.1 拷贝构造函数1.2 浅拷贝1.3 深拷贝 2 c语言拷贝 2.1 浅拷贝2.2 深拷...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

网友评论

      本文标题:C++ 浅拷贝和深拷贝

      本文链接:https://www.haomeiwen.com/subject/aafeurtx.html