纸上得来终觉浅,绝知此事要躬行 ---
今天对此话有了实际的领悟。之前学习C++的时候,自以为已经把深复制和复制构造函数等这些知识已经掌握了,但真正写起项目来的时候,还是不能提前考虑这些问题,直到问题出现,然后慢慢找出原因才开始根据以前的知识修改代码。
项目中使用到了这个弧形类
/*圆弧类*/ class Curve:public Graph { int pointCount; Point *points; public: Curve(Point *points,int pointCount); Curve(const Curve &_curve); ~Curve(); void draw(Graphics* graphics,Pen* pen); };
明显points指针需要深复制,因此需要重写copy constructor。但由于Curve类之前一直都是使用一次就析构,因此没有重写复制构造函数也没问题。
/*元器件类*/ class Component { vector<Line> lines; vector<Curve> curves; vector<Circle> circles; vector<Text> texts; public: Component(); //~Component(); void pushLine(Line _line);//每次放入一条线 void pushCurve(Curve _curve);//每次放入一条弧线 void pushCircle(Circle _circle);//每次放入一个圆形 void pushText(Text _text);//每次放入一段文本 void draw(Drawer _drawer);//绘制这个元器件 };
后来,新增了一个元器件类封装了这些图形。然后就出错了,思考后发现出错的原因是:放入component之前的curve实例析构了一次,然后component析构是vector里面的curve又析构了一次,就是第二次析构的时候delete了一个已经释放的内存空间,因此出现了运行时错误。
既然出现了问题,解决的方案也很明显,重写copy constructor进行深复制。