C++---深拷贝和浅拷贝

C++中的深拷贝和浅拷贝

这里使用c++中类的拷贝和幅值进行介绍:

深拷贝和浅拷贝的区别:

** 1. 浅拷贝就是系统默认提供的拷贝
** 2. 深拷贝就是重新在 堆区 开辟内存空间
** 3. 浅拷贝带来的问题就是: 内存重复释放
** 4. 浅拷贝的问题,要利用深拷贝来解决

代码示例:

#include 
#include  

using namespace std;

class Person{
public:
	Person(){
		cout << "Person的默认构造函数" << endl;
	}
	Person(int age, int height){
		m_age = age;
		m_height = new int(height); 
		cout << "Person的有参构造函数" << endl; 
	}
	
	// 浅拷贝带来的问题,要利用深拷贝来解决
	Person(const Person& p){
		m_age = p.m_age;
		//m_height = p.m_height; 	// 这是编译器自带的拷贝复制函数,为浅拷贝
		m_height = new int(*p.m_height); // 使用深拷贝,重新在堆区开辟一个内存空间,存放所指向的数据 
	} 
	
	~Person(){
		// 析构函数:将堆区开辟的数据进行释放 
		if(m_height != NULL){
			delete m_height;
			m_height = NULL;
		} 
		cout << "Person的析构函数" << endl;
	}
	
	int m_age;	// 年龄 
	int *m_height; 	// 身高,此时创建在堆区 
};

void test01(){
	Person p1(10,160);	// 使用有参构造函数初始化 
	Person p2(p1);		// 使用p1给p2复制,此时为浅拷贝 
	
	cout << "p1.m_age = " << p1.m_age << "  p1.m_height = " << *p1.m_height << endl; 
	cout << "p2.m_age = " << p2.m_age << "  p2.m_height = " << *p2.m_height << endl; 
	
	p2.m_age = 20;
	*p2.m_height = 170;	// 因为是浅拷贝,此时对堆区的数据进行修改时,p1和p2的内容均会改变 
	
	cout << "------------改变p2的年龄后:-----------------" << endl;
	cout << "p1.m_age = " << p1.m_age << "  p1.m_height = " << *p1.m_height << endl; 
	cout << "p2.m_age = " << p2.m_age << "  p2.m_height = " << *p2.m_height << endl; 
}

int main(){
	test01();
}

结果

使用浅拷贝时的结果(可以发现对p2中的年龄进行修改时,p1中的年龄也会进行修改)。
而且,如果在类中的析构函数中将堆区的内容进行释放,那么当另一个了类再次释放时,会造成内存重复释放,出现错误
C++---深拷贝和浅拷贝_第1张图片
(这个是在DEV-C++中进行的编译,所以可以出现结果。下面是在Visio Stdio中进行编译的过程,可以发现出现了该程序已经出现了异常。)C++---深拷贝和浅拷贝_第2张图片

当使用深拷贝时则可以避免堆区内存重复释放

C++---深拷贝和浅拷贝_第3张图片

你可能感兴趣的:(C/C++,c++)