Part ONE.引入
以下是产生BUG的代码。
#include<iostream>
using namespace std;
class Int{
public:
int* ptr;
public:
Int(int num){
ptr = new int(num);
}
~Int(){
delete ptr;
}
};
void test(){
Int x(1), y(x);
}
int main(){
test();
return 0;
}
Part TWO.分析
- 编译器给我们提供的拷贝方法是单纯的“值传递”。
int a, b; a = 1; b = a;
那么“b”的值就是1;
更进一步的,对于指针而言也是如此。int a = 1; int *ptr1, *ptr2; ptr1 = &a; ptr2 = ptr1;
在上面的这段代码中,ptr1与ptr2所操作的是同一块内存。
-
同一块堆内存只能被释放一次。
int num = new int; delete num; delete num;
这一段代码就会报错。
-
在第一部分中的代码中,就是因为堆内存的重复释放导致了bug的产生。
Part THREE.修正
修正的基本思路:自己新建一个拷贝构造函数,在拷贝构造的函数内部,重新开辟一块内存,再存放数据。
#include<iostream>
using namespace std;
class Int{
public:
int* ptr;
public:
Int(int num){
ptr = new int(num);
}
Int(const Int &comer){
ptr = new int(*comer.ptr);
}
~Int(){
delete ptr;
}
};
void test(){
Int x(1), y(x);
}
int main(){
test();
return 0;
}