2011-02-05 148 views
-1

我有一個場景類與成員變量圖像**圖像,int * xcoords,int * ycoords。現在,我試圖超載my =操作符。運算符重載問題

我得到以下的內存錯誤(使用的valgrind)

Conditional jump or move depends on uninitialised value(s) 
==6439== at 0x406FCA: Scene::drawscene() const (scene.cpp:160) 
==6439== by 0x4084C1: main (testscene.cpp:50) 

並從上面所討論的行(scene.cpp:160)是

if (images[i]!=NULL) 

所以更有耐力說,圖像是不初始化。

所以其他地方drawscene()被稱爲沒有造成任何問題,但我認爲,因爲=運算符被使用,它引起了一個問題。

任何人都可以看到我的代碼中可能會導致此錯誤的任何問題?

+0

請記住我對[copy-and-swap idiom]的說法(http://stackoverflow.com/questions/3279543/what-is-the-copy-and -swap-成語)?也就是說,要使用它? – GManNickG 2011-02-05 02:01:56

+0

是的,但這是我們應該爲此課程實施的方式。我想我知道它幾乎是正確的,但我不知道錯誤在哪裏。 – iRobot 2011-02-05 02:04:14

回答

3

你需要這樣的:

 if(source.images[i]!=NULL) { 
      images[i]=new Image; 
      *images[i]=*source.images[i]; 
      xcoords[i]=source.xcoords[i]; 
      ycoords[i]=source.ycoords[i]; 
     } else { 
      images[i] = NULL; 
     } 

,這將解決你眼前的問題。但是,真的,你正在以這種錯誤的方式去做。正如@Gman所說,你應該使用copy-and-swap idiom

使用習語的原因是異常安全。如果在operator =中間引發異常(並且因爲它做得太多而有很多東西可用),那麼將會使對象處於未定義狀態,這非常糟糕。複製和交換成語可以讓你編寫一個異常安全的複製構造函數(這仍然有點棘手),然後利用它構建一個賦值運算符。

作爲一個額外的好處,你會得到一個工作副本構造函數和一個swap函數。複製構造函數在STL容器中填充事物並按值傳遞或返回事物非常方便。對於你的類的用戶來說,swap函數是非常有用的,特別是那些想要實現自己的異常安全拷貝構造函數和賦值操作符的人。

0

如果source.images[i]非空,則只初始化images[i]。如果source.images[i]爲NULL,那麼你會留下隨機垃圾images[i]