请参阅TC ++ PL第3版的第10.4.4.1节“复制对象”

时间:2012-01-17 06:51:54

标签: c++

class table{ name *p; int i;
public:
table(int j=15){p=new name[i=j]} //constructor
~table(){delete[]p;} }

 void h()     
{
    table t1;  
    table t2=t1; 
    table t3;  
    t3=t2;
}`

Bjarne为t1创建的数组将被删除3次,因为为t1创建的数组出现在t1t2t3 **

请你解释一下这与其他一些例子有什么关系。

1 个答案:

答案 0 :(得分:0)

如果复制构造函数和运算符=仅复制指针的值,则在结尾t1,t2和t3将指向相同的内存位。如果table有一个删除指针的析构函数,那么同一个指针将被删除三次 - 每个对象一次。这应该导致段错误。

为了防止这种情况,一个类可以为每个副本分配一个新数组(称为制作deep copy),或者reference counting