c++中的默认的拷贝函数,会把所有属性都给拷贝。
现在假如有个指针型 比如 int* height 数据
当我们在有参函数中使用了这么个语句:
Person(int h)
{
height=new int (h); //height是属性 定义是 int*height
}
这条语句 由我们自己开辟了名为height的空间 放到了堆区 在析构函数里 我将它delete
~person()
{
delete(height);
height=NULL;
}
这样写会带来什么问题呢?
由于系统自带的拷贝函数,那么我在进行对象拷贝的时候,会把height这一片空间拷贝过去,也就是公用的一个地址。当我在delete(height)之后,这片空间就消失了。其它的对象在拷贝的时候,访问就会出问题。
所以应该如何修改呢?
不再使用默认的拷贝函数,而是自己创造拷贝函数。
Person(const Person &p)
{
height=new int (*p.height);
}
区别:使用默认的拷贝函数,两个对象会共用同一片height空间;
而自己写的这行,是开辟了一个新的height空间,然后给它赋值。
2022-02-06