1

クラスの循環キューを実装する必要がありました。プログラムをテストすると、プログラムは適切にエンキューおよびデキューされます。しかし、新しいオブジェクトを作成してそれを別のオブジェクトと等しく設定すると、すべてが正しく出力されますが、最後にクラッシュしてエラーが発生します。

Expression: _BLOCK_TYPE_IS_VALID(pHead -> nBlockUse)

デバッガーを実行しましたが、問題はデキュー機能の行にあると表示されます。これがその関数です。

void CQUEUE::Dequeue()
{
if(Isempty())
{
    cout << "Queue is  empty, nothing to delete." << endl;
    return;
}

if((!Isempty()) && (front == back)) //When there is only 1 item in the queue
{                                   // front and back will point to the same node
    delete front;                   //but it wont be null because of that 1 item
    front = back = 0;   
    return;
}

qnode *p = front;
front = front -> next;
delete p;//<----------DEBUGGER POINTS HERE**************
front -> prev = back;
return;

}

私が言ったように、私が新しいオブジェクトを作成してこれを行うまで、プログラムは正常に動作します

 CQUEUE j = k;//Any Enqueues and Dequeues after this work, but it crashes

これが問題である場合のコピーコンストラクターですか?

CQUEUE::CQUEUE(CQUEUE & original)//Will not compile if I put Const 
{                               //in the parameter for some reason
front = back = 0;           //So I took it out
(*this) = original;
front -> prev = back;
back -> next = front;

}
4

1 に答える 1

1

コピーコンストラクターでは、次のことを行います。

(*this) = original;

frontは、のポインタCQUEUE jCQUEUE k両方が同じメモリを指していることを意味します。

void CQUEUE::Dequeue()の両方に対してが呼び出されるとjkメモリがdelete p; double削除され、クラッシュが発生します。

また、コピーコンストラクタはとして宣言する必要がありますconstCQUEUE::CQUEUE(const CQUEUE& original)。これ以上のコードがないと言うのは難しいですが、コピーコンストラクターでは、ポインターのディープコピーを作成する必要があります(を使用してメモリを割り当てますnew)。三つのルールとは何ですか?役立つかもしれません。

于 2012-07-10T04:21:48.240 に答える