深拷贝与浅拷贝的区别

深浅拷贝的区别:
    浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。

    深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。

Student.h


Student.cpp


结果:

一次构造

两次析构


    编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。


    所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。

Student.h


Student.cpp


test.cpp


结果:

构造一次

拷贝构造一次

析构两次


综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。

    

转载自:https://blog.csdn.net/Liudengdeng_/article/details/78334952

深浅拷贝的区别:
    浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。

    深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。

Student.h


Student.cpp


结果:

一次构造

两次析构


    编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。


    所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。

Student.h


Student.cpp


test.cpp


结果:

构造一次

拷贝构造一次

析构两次


综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。

    

转载自:https://blog.csdn.net/Liudengdeng_/article/details/78334952

猜你喜欢

转载自blog.csdn.net/baidu_38172402/article/details/81586761