コピーコンストラクタ関数を呼び出すと、クラッシュするのはなぜですか?私のコピーコンストラクタで何が問題になっていますか?
私のクラス定義にあるコピー手順では、コピーを開始する前に他の元のキューのコピーとして作成されるキューが空であることを確認しています。つまり、キューq1が空ではないとしましょうq1をq2に変えたいと思います。私はあなたのコピーコンストラクタにback
とfront
を初期化するのを忘れ
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
class Dnode
{
public:
Dnode(int);
int n;
Dnode* l, *r;
};
Dnode::Dnode(int tx)
{
n = tx;
l = r = NULL;
}
class Queue // reminder: insertions at the rear, deletions at the front
{
public:
Queue();
void enqueue(int x);
int dequeue(void);
bool empty(void) const;
void display(void) const;
Queue(const Queue&); //copy constructor
private:
Dnode* front, *back;
void copy(Dnode*);
void free();
};
Queue::Queue()
{
front = back = NULL;
}
void Queue::enqueue(int x)
{
Dnode* d = new Dnode(x);
if (empty())
front = back = d;
else
{
back->r = d;
d->l = back;
back = d;
}
}
int Queue::dequeue(void)
{
assert(! empty());
Dnode* temp = front;
front = front->r;
if (front == NULL)
back = NULL;
else front->l = NULL;
int x = temp->n;
delete temp;
return x;
}
bool Queue::empty(void) const
{
return front == NULL;
}
void Queue::display(void) const
{
for (Dnode* d = front; d != NULL; d = d->r)
cout << d->n << " ";
cout << endl;
}
void Queue::copy(Dnode* dn) // "dn" will be "Front" of Queue being copied
{ // this procedure will be called in Copy Constructor
Dnode* temp=front; // found underneath this procedure
while(front!=back)
{
front=front->r;
delete temp;
temp=front;
}
delete temp;
front=back=temp=NULL;
if(dn!=NULL)
{
while(dn->r!=NULL)
{
enqueue(dn->n);
dn=dn->r;
}
enqueue(dn->n);
}
}
Queue::Queue(const Queue& x)
{
copy(x.front);
}
int main()
{
Queue q;
if (q.empty()) cout << "q empty" << endl;
for (int i = 0; i < 10; i++) q.enqueue(i);
q.display();
int x = q.dequeue();
cout << "x is " << x << endl;
q.display();
Queue q1(q); //<----program crashes when we get here
q1.display();
}
コピーするとどうしてあなたが削除されますか?コピー中にメモリを解放する必要はありません。実際には、コピーを保持するためにQueueの新しいインスタンスにメモリを割り当てる必要があります。 – linuxuser27
あなたはどこにでも初期化されていないポインタを使用して削除しています... – jrok
あなたが言うように、他のキューがコピーになるキューを空にすることは不要かもしれませんが、それはプログラムが正しくクラッシュする理由であってはなりません。私は間違って何をしていますか? –