c++之深拷贝和浅拷贝
发布时间:2020-12-16 09:05:50 所属栏目:百科 来源:网络整理
导读:浅拷贝:简单的赋值拷贝操作。 深拷贝:在堆区重新申请空间,进行拷贝操作。 #includeiostream using namespace std; class Person { public : int m_age; int * m_height; Person() { cout " Person默认构造函数 " endl; } Person( int age, height) { m_ag
浅拷贝:简单的赋值拷贝操作。 深拷贝:在堆区重新申请空间,进行拷贝操作。 #include<iostream> using namespace std; class Person { public: int m_age; int* m_height; Person() { cout << "Person默认构造函数" << endl; } Person(int age, height) { m_age = age; m_height = new (height);//浅拷贝 cout << Person(int age)构造函数const Person& p) { m_age = p.m_age; m_height = int(*p.m_height);//这就是深拷贝操作 cout << 拷贝构造函数 endl; } ~Person() { 将堆区的数据进行释放 浅拷贝带来的问题就是重复释放,可以利用深拷贝来解决 if (m_height != NULL) { delete m_height; m_height = NULL; } cout << Person析构函数 endl; } }; void test() { Person p1(18,178); cout << p1的年龄为:" << p1.m_age << 身高为:"<<*p1.m_height<<endl; Person p2(p1); cout << p2的年龄为:" << p2.m_age << " << *p2.m_height << endl; } main() { test(); system(pause"); return 0; } 输出: ? 为什么浅拷贝会带来重复释放问题呢? 在堆区开辟内存存储数据之后,如果不自己定义拷贝构造函数,那么系统会调用默认的拷贝构造函数,这种情况下就是浅拷贝,此时,p2和p1的m_height都指向同一块地址。当p2被释放之后,即指向的地址释放了,此时再去释放p1,p1就找不到其指向的内存,但是又要进行释放,所以就重复释放,运行时会报错。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |