C++的深拷贝和浅拷贝

mac2024-03-18  28

以下内容是参考大神博客:https://blog.csdn.net/caoshangpa/article/details/79226270 进行整理得出来的

一、浅拷贝

根据例子,我所理解的浅拷贝就是 :程序中没有定义拷贝构造函数,但是程序中进行拷贝的操作,具体有哪些拷贝的操作可以

参考之前写的一篇博客:https://blog.csdn.net/Littlehero_121/article/details/102817099

下面的代码就演示了,没有拷贝构造函数的浅拷贝会导致的问题:

#include <iostream> using namespace std; class A { private: int num; char *name; public: A(); ~A(); }; A::A() { name = new char(20); cout << "enter constructor" << endl; } A::~A() { cout << "enter destructor " << (int)name << endl; delete name; name = NULL; } int main() { { //局部变量结束的时候会自动释放内存 A s1; A s2(s1);// 复制对象 } system("pause"); return 0; }

发现会出现构造函数被调用一次,而析构函数会被调用两次的情况。所以浅拷贝会出现问题悬空指针还有重复释放

 二、深度拷贝

深拷贝的问题,深拷贝就是需要自己加上一个拷贝函数,这样就不会出现上述的问题了

#include <iostream> using namespace std; class A { private: int num; char *name; public: A(); ~A(); A(const A &s);//拷贝构造函数,const防止对象被改变,也就是进行深拷贝 }; A::A() { name = new char(20); cout << "enter constructor" << endl; } A::~A() { cout << "enter destructor " << (int)name << endl; delete name; name = NULL; } A::A(const A &s) { name = new char(20); memcpy(name, s.name, strlen(s.name)); cout << "enter copy " << endl; } int main() { { //局部变量结束的时候会自动释放内存 A s1; A s2(s1);// 复制对象,这个时候进行的就是深拷贝 } system("pause"); return 0; }

参考博客:https://blog.csdn.net/wue1206/article/details/81138097

浅拷贝:只是拷贝内存地址(指针变量的地址复制),这样就会导致拷贝完之后,两个指针指向的是同一个内存,导致程序崩了。

深拷贝:就是直接开创出来新的内存空间这样指针指向的是两块不同的地址

 

最新回复(0)