2011-02-05 6 views
-1

メンバー変数Image ** images、int * xcoords、int * ycoordsを持つシーンクラスがあります。今、私は=演算子をオーバーロードしようとしています。演算子のオーバーロードに関する問題

私は

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) 

(valgrindのを使用して)以下のメモリエラーを取得し、(scene.cpp:160)は、上記の問題の行はそう聞きしたい画像がなかったこと

if (images[i]!=NULL) 

を言っています初期化されました。

他にもdrawscene()が呼び出されても問題はありませんでしたが、=演算子が使用されたため問題が発生したと思います。

このエラーが発生する可能性のあるコードに問題が発生した場合は誰にも見られますか?

+0

[コピーとスワップのイディオム](http://stackoverflow.com/questions/3279543/what-is-the-copy-and)について私が言ったことを覚えておいてください。 -swap-idiom)?すなわち、それを使用するには? – GManNickG

+0

はい、これがこのクラス用に実装される方法です。私はそれがほぼ正しいと思うが、私はバグがどこにあるかわからない。 – iRobot

+0

この宿題はありますか? – Marlon

答えて

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

Aha私は、 ! – iRobot

0

source.images[i]がNULLでない場合は、images[i]のみ初期化します。 source.images[i]がNULLの場合、ランダムなゴミを残すimages[i]

関連する問題