c++浅拷贝和深拷贝问题
C++的深浅复制问题
当使用浅复制的时候
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
Person(){
cout <<"class 's defualt contructor call"<<endl;
}
Person(int age,int height){
m_age = age;
m_height = new int(height);
cout <<"class 's contructor call with arguments"<<endl;
}
~Person(){
//cout <<"class 's destructor call"<<endl;
if(m_height != NULL){
delete m_height;
m_height = NULL;//如果利用编译器提供的拷贝构造函数,会做浅拷贝操作
}
}
int m_age;
int *m_height;
};
int main(){
Person p1(18,180);
cout << "p1的年龄是:"<<p1.m_age<<endl<<" p1的身高是:"<<*p1.m_height<<endl;
Person p2(p1);
cout << "p2的年龄是:"<<p2.m_age<<endl<<" p2的身高是:"<<*p2.m_height<<endl;
return 0;
}
出现的问题

问题出现的原因

if(m_height != NULL){
delete m_height;
m_height = NULL;
}
根据先入后出原则,p2会首先把栈区中的内存空间给释放,当检测p1的时候m_height中的值也非空,这就导致再次释放栈区内存(双重释放),程序运行错误;
问题解决:使用深拷贝,手写一个拷贝构造函数
原理图:

实现方法:
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
Person(){
cout <<"class 's defualt contructor call"<<endl;
}
Person(int age,int height){
m_age = age;
m_height = new int(height);
cout <<"class 's contructor call with arguments"<<endl;
}
~Person(){
//cout <<"class 's destructor call"<<endl;
if(m_height != NULL){
delete m_height;
m_height = NULL;//如果利用编译器提供的拷贝构造函数,会做浅拷贝操作
}
}
Person(const Person&p){
cout << "Person's copy constructor call "<<endl;
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,180);
cout << "p1的年龄是:"<<p1.m_age<<endl<<" p1的身高是:"<<*p1.m_height<<endl;
Person p2(p1);
cout << "p2的年龄是:"<<p2.m_age<<endl<<" p2的身高是:"<<*p2.m_height<<endl;
return 0;
}
浙公网安备 33010602011771号