2011-08-12 5 views
0

は、次のコードを考えますstep-overハッシュ[tmpSet] =ポリライン、コピーコンストラクタ内のp.startはNULLです。次に、2回目に呼び出されます。そのとき、p.startはその中に奇妙な値が設定されています。C++コピーコンストラクタ奇妙な行動

何が起こっているのか?

おかげで、 エーリッヒ

EDIT 1:それを固定多項式クラスに代入演算子を追加すると思ったが、それはしませんでした。それでも同じ問題があります。

+1

p.startがnull(デフォルト)の場合でも、代入演算子を修正しました。どこでも 'if(p.start!= NULL){'は{} else {start = NULL;}'で終わるべきです(まず、代入演算子で割り当てを解除するのを忘れないでください) –

+0

まあ、多分私は間違っています。私は愚かだとは思わないでください。内部ポインタを持つハッシュコンテナオブジェクトを配置します。オブジェクトをコンテナに置くとコピーされます(あなたの場合はポインタアドレスのみ)。プログラムが範囲外になると、ポインタを数回破壊しようとします。だからそこに参照カウントなど何らかのポインタを使うべきです。私が間違っていれば訂正してください。 – legion

+0

ありがとうございます。私はelseステートメントを追加しましたが、今は動作しています。なぜこれで問題が解決されたのか少し説明できますか?また、「代入演算子を最初に割り当て解除する」とはどういう意味ですか? –

答えて

4

あなたはRule of Threeに違反している:
あなたのクラスのコピーコンストラクタ、あなた万一過負荷コピー代入演算子デストラクタに過負荷をかけているので。

上記の文は、あなたのコード例では、必見べきを置き換えることができ、一般的なシナリオを参照していました。

+0

「必須」はおそらく強すぎます。 「すべき」がより適切です。 –

+0

@Oli Charlesworth:この場合、** must mustは必須です:) –

+0

@Als:本当です!とにかく、+1。 –

0

デフォルトのコンストラクタを追加する必要があります。ここでは、start to NULLを初期化します。

+0

上記の編集をご覧ください。 –

2

2つの問題。

1)引数のないコンストラクタはありません。そのため、コンパイラは当てはまると思われる初期値をファイリングしています。 p.startが最初にNULLであるという事実は )あなたのコピーコンストラクタは、あなたがクラス内の変数のいずれかを初期化していないので、次のコピーは、コンパイラどんな初期値を持つことができp.start == NULLpolynomialに合格しています割り当てます(問題#1を参照)。

修正するには、多項式を初期状態に初期化する引数なしのコンストラクタを追加する必要があります。そして、コピーコンストラクタは、そのような多項式が渡された場合、それ自体を初期状態に初期化する必要があります。

+0

上記の編集をご覧ください。 –

+0

第2のポイントは依然として立っています。空の多項式をコピーコンストラクタに渡すと、 'p.start'がNULLであることがわかります。次に、 'this-> start'をNULLに設定することはありません(デフォルトのコンストラクタはコピーコンストラクタでは実行されません)。 –

0

Alsが指摘したように、あなたは3つのルールに違反しています。 よく見ると、コンテナに何かを置くと、あなたのポインタに何が起こりますか?

monomial *start; 
monomial *next; 

これについて考えてみましょう。

+0

上記の編集をご覧ください。 –

0

コピーコンストラクタは、p.start == NULLの場合、開始値にランダムな値を設定します。これは、プログラムの他のコードによっては、問題の原因となる可能性があります。 また、代入演算子がないため、コンパイラはシャローコピーを実行しています。別の関数を追加する必要があります。polynomial &operator=(const polynomial& b)

+0

上記の編集をご覧ください。 –