zoukankan      html  css  js  c++  java
  • [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进行深复制。

  • 相关阅读:
    Find cmd
    splitFile2SmallFile
    IPC-->PIPO
    Thread and shared lock
    Python Thread related
    linux 文件系统
    linux commands
    关于 gnome3 无法显示应用程序所有界面的反馈
    Windows 网络编程
    常见端口 HTTP代码
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3501595.html
Copyright © 2011-2022 走看看