我不得不为上课实施一个循环队列。测试该程序时,该程序正确入队和出队。但是,每当我创建一个新对象并将其设置为另一个对象时,所有内容都会正确打印,但最终会崩溃,并显示错误:

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;

这意味着frontCQUEUE j中的CQUEUE k指针都指向相同的内存。

当同时为void CQUEUE::Dequeue()j调用k时,delete p; double 会删除内存,从而导致崩溃。

另外,您的副本构造函数必须声明为constCQUEUE::CQUEUE(const CQUEUE& original)。没有更多的代码很难说,但是在复制构造函数中,您需要制作指针的深拷贝(使用new分配内存)。阅读What is The Rule of Three?可能会有所帮助。

关于c++ - 错误实现循环队列时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11406287/

10-13 09:25