[C++]有关深复制与copy constructor的一些问题与实例

纸上得来终觉浅,绝知此事要躬行 ---

  今天对此话有了实际的领悟。之前学习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进行深复制。

原文地址:https://www.cnblogs.com/iyjhabc/p/3501595.html