[C++]有关深复制与copy constructor的一些问题与实例
紙上得來終覺淺,絕知此事要躬行 ---
今天對(duì)此話有了實(shí)際的領(lǐng)悟。之前學(xué)習(xí)C++的時(shí)候,自以為已經(jīng)把深復(fù)制和復(fù)制構(gòu)造函數(shù)等這些知識(shí)已經(jīng)掌握了,但真正寫起項(xiàng)目來的時(shí)候,還是不能提前考慮這些問題,直到問題出現(xiàn),然后慢慢找出原因才開始根據(jù)以前的知識(shí)修改代碼。
項(xiàng)目中使用到了這個(gè)弧形類
/*圓弧類*/ 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指針需要深復(fù)制,因此需要重寫copy constructor。但由于Curve類之前一直都是使用一次就析構(gòu),因此沒有重寫復(fù)制構(gòu)造函數(shù)也沒問題。
/*元器件類*/ 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);//每次放入一個(gè)圓形void pushText(Text _text);//每次放入一段文本void draw(Drawer _drawer);//繪制這個(gè)元器件 };后來,新增了一個(gè)元器件類封裝了這些圖形。然后就出錯(cuò)了,思考后發(fā)現(xiàn)出錯(cuò)的原因是:放入component之前的curve實(shí)例析構(gòu)了一次,然后component析構(gòu)是vector里面的curve又析構(gòu)了一次,就是第二次析構(gòu)的時(shí)候delete了一個(gè)已經(jīng)釋放的內(nèi)存空間,因此出現(xiàn)了運(yùn)行時(shí)錯(cuò)誤。
既然出現(xiàn)了問題,解決的方案也很明顯,重寫copy constructor進(jìn)行深復(fù)制。
轉(zhuǎn)載于:https://www.cnblogs.com/iyjhabc/p/3501595.html
總結(jié)
以上是生活随笔為你收集整理的[C++]有关深复制与copy constructor的一些问题与实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神人给自行车穿上鞋后 就再也不担心会爆胎
- 下一篇: DC漫改剧《睡魔》IGN9分:它近乎完美