class Person {
public:
Person(){}
Person(int age, int height) {
_age = age;
_height = new int(height);
}
~Person() {
if (_height) {
delete _height;
_height = NULL;
}
}
int _age;
int* _height;
};
使用时:如使用编译器提供的拷贝构造函数:
Person p1(19,180);
Person p2(p1);
运行会导致程序崩溃,原因是,编译器提供的拷贝构造函数在将p1的值传递给p2时,
( 类里面指向在堆区开辟的内存的指针:int* _height)只是将地址赋给了p2,所以p2和p1内的_height指向同一块堆区内存。 在调用析构函数时,p2中_height指向的内存被释放了,而后面p1_height指向的内存又会被释放一次,所以导致程序崩溃。这就是编译器提供的拷贝构造函数是浅拷贝,堆区的内存重复释放。
解决:
//自己实现浅拷贝构造函数,不使用编译器提供的拷贝构造函数
Person(Person& p) {
_age = p._age;
_height = new int(*p._height); //深拷贝
}