浅拷贝和深拷贝是指在C++中对对象进行复制时的两种不同方式。
浅拷贝是指将一个对象的值复制到另一个对象中,但是只复制对象的值,而不复制对象内部的指针或引用。这意味着如果原始对象中包含指针指向堆内存,那么浅拷贝后的对象和原始对象将共享同一块堆内存,当其中一个对象释放内存时,另一个对象将指向无效的内存地址,可能导致程序崩溃或产生未定义行为。
深拷贝是指将一个对象的值和对象内部的指针或引用都复制到另一个对象中,这样新对象和原始对象将拥有各自独立的内存空间,不会相互影响。这样可以避免浅拷贝可能导致的问题,但是深拷贝可能会增加内存和时间开销。
#include<iostream>
using namespace std;
//深拷贝与浅拷贝
class person
{
public:
person()//无参构造
{
cout << "person的无参构造函数的调用" << endl;
}
person(int age,int height)
{
m_age = age;
Height=new int(height);//开辟到堆区,后续需要手动释放
cout << "person的有参函数的调用" << endl;
}
//自己实现拷贝构造函数
person(const person& p)
{
cout << "person拷贝构造函数调用" << endl;
m_age = p.m_age;
//Height=p.Height编译器默认构造函数实现的是这行代码
//深拷贝
Height = new int(*p.Height);
}
~person()
{
//析构函数将堆区开辟的数据释放
if (Height != NULL)
{
delete Height;
Height = NULL;//防止野指针出现,做滞空操作
}
cout << "person的析构函数的调用" << endl;
}
int m_age;
int* Height;
};
void test1() {
person p(12,170);
cout << "p的年龄为:" << p.m_age << " p的身高为:" << *p.Height << endl;
person p2(p);//利用编译器提供的拷贝构造函数,会做浅拷贝操作
//根据上述析构函数代码,会调用两次析构函数(先释放p2后释放p)
//会对堆区Height内存释放两次,电脑出错或者崩溃
//浅拷贝问题要用深拷贝解决,可以自己写一个拷贝构造函数
cout << "p2的年龄为:" << p2.m_age << " p2的身高为:" << *p2.Height << endl;
}
int main()
{
test1();
system("pause");
return 0;
}