• [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进行深复制。

  • 相关阅读:
    [Silverlight]常见问题
    [C#]有趣的VS扩展DebuggerVisualizer
    [EF5.0CODE FIRST]多对一及自关联映射的处理
    自定义控件传值
    关于.Net中类型转换ToInt32
    SQL版整数转IP
    SQL2008 Merge关键字用法与简例
    SQL语句,同时返回结果集,输出参数的值及return值
    多线程与异步操作实现的探讨
    SQL Prompt4 破解版
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3501595.html
Copyright © 2020-2023  润新知