自学内容网 自学内容网

【C/C++语言系列】浅拷贝和深拷贝

浅拷贝和深拷贝在面试中经常被问,十分重要。
浅拷贝问题:如果有数据创建在堆区,那么在析构时会出现重复析构的问题。
解决方法:使用深拷贝去解决堆区数据重复释放的问题
观察下面代码,发现浅拷贝问题:

class Person {
public:
//无参(默认)构造函数
Person() {
cout << "无参构造函数!" << endl;
}
//有参构造函数
Person(int age ,int height) {

cout << "有参构造函数!" << endl;

m_age = age;
m_height = new int(height);

}

//析构函数
~Person() {
cout << "析构函数!" << endl;
if (m_height != NULL)
{
delete m_height;
}
}
public:
int m_age;
int* m_height;
};

void test01()
{
Person p1(18, 180);
Person p2(p1);   
cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;
cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

int main() {
test01();
system("pause");
return 0;
}

如果不写拷贝构造函数,编译器会自动生成一个浅拷贝的拷贝构造函数:

//系统自动加的拷贝构造函数  
Person(const Person& p) {
cout << "拷贝构造函数!" << endl;
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
m_height = p.m_height  //浅拷贝,两个指针指向相同
}

浅拷贝报错原因:这样两个m_height指针指向同一块内存,它们各自都调用析构函数就会造成堆区数据重复释放。

解决方法深拷贝:重新在堆区创建一块内存,它们的指向不同,单指向的内容相同,这样在析构时分别释放自己的堆区数据。

//拷贝构造函数  
Person(const Person& p) {
cout << "拷贝构造函数!" << endl;
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
m_height = new int(*p.m_height);  //深拷贝
}

原文地址:https://blog.csdn.net/xaiobai123/article/details/142407776

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!