gpt4 book ai didi

c++ - 链表队列在一次调用 dequeue() 后清除整个链

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:12 26 4
gpt4 key购买 nike

我正在尝试制作一个运行模拟的程序。使用断点,我已经验证入队方法运行了正确的次数,并且似乎有一个完整的节点链表。然后程序应该运行 dequeue 方法一定次数。 dequeue 方法运行一次,由于某种原因它会在第一个节点之后立即中断列表。然后,当 dequeue 尝试调用 getNext() 函数来获取下一个节点时,我收到错误“访问冲突读取位置”。我不明白为什么要这样做。如果您需要查看更多代码,请告诉我。感谢所有帮助。这是 Node.cpp。

Node::Node(Frame data) : data(data), next(NULL)
{}

Node::Node(Frame data, Node node) : data(data), next(&node)
{}

void Node::setData(Frame data){
this->data = data;
}

Frame Node::getData(){
return data;
}

void Node::setNext(Node node){
this->next = &node;
}

Node Node::getNext(){
return *next;

队列方法

PPLQueue::PPLQueue() : length(0), firstNode(NULL), lastNode(NULL)
{}

bool PPLQueue::enqueue(Frame data, int maxSize){
Node *newNode = new Node(data);

if(isFull(maxSize))
return false;
else if(isEmpty()){
firstNode = newNode;
lastNode = newNode;
incrementLength();
}
else{
lastNode->setNext(*newNode);
lastNode = newNode;
incrementLength();
}
return true;
}

Node* PPLQueue::dequeue(){
Node *nodeProbe = firstNode;

if(isEmpty())
return nodeProbe;
else if(length > 1){
*firstNode = nodeProbe->getNext();
decrementLength();
return nodeProbe;
}
else{
firstNode = NULL;
lastNode = NULL;
decrementLength();
return nodeProbe;
}
}

bool PPLQueue::isFull(int maxSize){
if(length == maxSize)
return true;
else
return false;
}

bool PPLQueue::isEmpty(){
if(length == 0)
return true;
else
return false;
}

调用方法的代码:

            for(int i=0; i < burstSize; i++){
if(!queue.enqueue(frame, bucketSize)){
discardedFrames += (burstSize - i);
break;
}
}
burstTime[burstCount] = time(NULL);
burstCount++;
}

for(int j = 0 ; j < framesToRelease; j++){
if(queue.dequeue() != NULL){
releasedFrames++;
}

当我收到错误和访问冲突时,程序已在 Node.cpp 中的 getNext 方法处停止。

最佳答案

您的问题从这里开始:

Node::Node(Frame data, Node node) : data(data), next(&node)
{}

这里:

void Node::setNext(Node node){
this->next = &node;
}

存储指向参数的指针的位置,其生命周期在函数返回时结束。
取消引用这些指针是未定义的,可能会产生意想不到的结果,例如直到很久以后才会引起问题。

它们应该是这样的:

Node::Node(Frame data, Node* node) : data(data), next(node)
{}

void Node::setNext(Node* node){
this->next = node;
}

关于c++ - 链表队列在一次调用 dequeue() 后清除整个链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24236851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com