我不得不为上课实施一个循环队列。测试该程序时,该程序正确入队和出队。但是,每当我创建一个新对象并将其设置为另一个对象时,所有内容都会正确打印,但最终会崩溃,并显示错误:
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;
}
最佳答案
在复制构造函数中,执行以下操作:
(*this) = original;
这意味着
front
和CQUEUE j
中的CQUEUE k
指针都指向相同的内存。当同时为
void CQUEUE::Dequeue()
和j
调用k
时,delete p;
double 会删除内存,从而导致崩溃。另外,您的副本构造函数必须声明为
const
。 CQUEUE::CQUEUE(const CQUEUE& original)
。没有更多的代码很难说,但是在复制构造函数中,您需要制作指针的深拷贝(使用new
分配内存)。阅读What is The Rule of Three?可能会有所帮助。关于c++ - 错误实现循环队列时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11406287/