C++之浅拷贝和深拷贝
浅拷贝:简单的复制拷贝操作
P1的生命周期结束后,判断m_PtrAge是否为空,很明显m_PtrAge的值是0x0100,不为空,释放m_PtrAge指向的内存;
P2的生命周期结束后,同样判断m_PtrAge是否为空,很明显m_PtrAge的值也是0x0100,也不为空,再次释放m_PtrAge指向的内存空间;
两次释放都指向同一块内存空间,造成堆区的数据重复释放,固有以上的crash信息,这就是浅拷贝带来的风险。
解决办法:
利用深拷贝解决浅拷贝带来的风险,即让P2对象中的m_PtrAge指向另一个内存单元,这样2个对象调用析构函数后,各自释放自己的内存单元
深拷贝:在堆区重新申请内存空间,进行拷贝操作
#include<iostream> #include<string.h> #include<memory> #include<stdio.h> using namespace std; //深浅拷贝操作 class Person { public: Person() { printf("Person的构造函数调用\n"); } Person(int a, int h) { m_age = a; m_height = new int(h); printf("Person的有参构造函数调用\n"); } ~Person() { //将堆区开辟的空间释放掉 if (m_Height != NULL) { delete m_Height; m_Height = NULL; //防止野指针出现 } printf("Person的析构造函数调用\n"); } Person(const Person &p) { printf("Person拷贝造函数调用\n"); m_age = p.m_age; // m_height = p.m_height; //编译器默认实现就是这行代码(浅拷贝) m_height = new int(*p.m_height); //深拷贝操作 } int m_age; int *m_height; } int main() { Person p1(18, 160); printf("Person p1.age: %d, *p1.height: %d\n", p1.age, *p1.height); Person p2(p1); printf("Person p2.age: %d, *p2.height: %d\n", p2.age, *p2.height); return 0; }