当我尝试在C ++中使基于循环链表的队列中的最后一个节点出队时,出现了分段错误。最后一个元素之前的其余元素已被成功删除,它只是最后一个元素,这似乎与释放有关,但是来自终端的唯一日志是Segmentation Fault:11.有人可以帮我理解为什么我会得到这种行为。我将以下完整的实现文件粘贴到下面,以防Enqueue函数或构造函数出现问题。
#include "BQUEUE.h"
#include <iostream>
using namespace std;
BQUEUE::BQUEUE(): front(nullptr) {}
BQUEUE::BQUEUE(const BQUEUE & queue){
bqnode *temp = queue.front;
while (temp->next != queue.front){
Enqueue(temp->time);
temp = temp->next;
}
Enqueue(temp->time);
}
BQUEUE::~BQUEUE(){
bqnode *current = front;
while (current->next != front)
Dequeue();
}
void BQUEUE::Dequeue(){
// Empty queue
if (front == nullptr){
return;
} else if (front->next == front){
front->next = nullptr;
delete front;
front = nullptr;
} else {
bqnode *temp = front, *current = front;
while (current->next != front)
current = current->next;
front = front->next;
current->next = front;
delete temp;
}
}
void BQUEUE::Print(){
bqnode *temp = front;
while (temp->next != front){
cout << temp->time << endl;
temp = temp->next;
}
cout << temp->time << endl;
}
void BQUEUE::Enqueue(int i){
bqnode *newNode = new bqnode;
newNode->time = i;
if (front == nullptr){
front = newNode;
front->next = front;
} else {
newNode->next = front;
bqnode *previous = front;
if (previous->next == front){
front->next = newNode;
return;
}
while (previous->next != front)
previous = previous->next;
previous->next = newNode;
}
}
驱动程序:
#include <iostream>
#include "BQUEUE.h"
using namespace std;
int main(){
BQUEUE k;
k.Enqueue(60);
k.Dequeue(); // Segmentation fault occurs here
}
标题:
#ifndef BQUEUE_H
#define BQUEUE_H
class bqnode {
public:
int time;
bqnode *prev, *next;
};
class BQUEUE {
public:
BQUEUE();
~BQUEUE();
BQUEUE(const BQUEUE &);
void Enqueue(int);
void Dequeue( );
void Print( );
private:
bqnode *front;
};
#endif
答案 0 :(得分:2)
一个问题是这个
ReflectionUtils.findField(httpComponentsClientHttpRequestFactory.getClass(), "connectTimeout");
然后在析构函数中,您没有检查void BQUEUE::Dequeue() {
// Empty queue
if (front == nullptr) {
return;
}
else if (front->next == front) { // <-- This is invoked when there is only one node remaining
front->next = nullptr;
delete front;
front = nullptr; // <--- This is now nullptr
}
...
是否为front
:
nullptr
然后,您访问BQUEUE::~BQUEUE() {
bqnode *current = front; // <-- No check to see if front is nullptr
while (current->next != front)
Dequeue();
}
,这是无效的,因为current->next
是current
。解决方法是简单地检查nullptr
是否为front
,如果是,则无事。
nullptr