接收不一致的访问冲突,处理队列
Receiving inconsistent access violation working with queues
我正在编写一个简单的队列程序,该程序运行 for 循环并向队列添加递增的值。在达到队列的容量后,它会创建一个临时队列,该队列等于新的动态协调队列,并使新队列的容量加倍。它从大小 8 开始,但在尝试 124 数组时成为访问冲突。
#include <iostream>
using namespace std;
class queue {
public:
queue();
void enqueue(int item);
void dequeue();
int front();
bool empty();
private:
int * data;
int myFront;
int myBack;
int size;
int capacity;
};
queue::queue() {
myFront = 0;
myBack = 0;
size = 0;
capacity = 8;
data = new int[capacity];
}
bool queue::empty() {
return (size == 0);
}
void queue::enqueue(int item) {
if (size == capacity - 1) {
int * temp = new int[capacity * 2];
for (int i = 0; i < size; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
capacity = capacity * 2;
myFront = data[0];
//myBack = temp[capacity/2];
}
data[myBack] = item;
myBack++;
size++;
}
int queue::front() {
return data[myFront];
}
void queue::dequeue() {
myFront = (myFront + 1) % capacity;
size = size - 1;
}
int main() {
queue nq;
// enqueue numbers 0-49
for (int i = 0; i < 50; i++) {
nq.enqueue(i);
}
// dequeue 25 times. Show prints 0 1 2 ... 24
for (int i = 0; i < 25; i++) {
cout << nq.front() << " ";
nq.dequeue();
}
cout << endl;
cout << "Check point 1" << endl;
// enqueue numbers 50-124. Now the queue should be
// 25 26 ... 124 from front to end
for (int i = 50; i < 125; i++) {
nq.enqueue(i);
}
// dequeue 100 times. should show 25 26 ... 124
for (int i = 0; i < 100; i++) {
cout << nq.front() << " ";
nq.dequeue();
}
cout << endl;
int temp1;
cin >> temp1;
}
代码的哪一部分创建了此访问错误,我该怎么做才能解决它?它在前几次迭代中运行似乎很好,但随后在结束时停止正确访问。
enqueue
不处理队列包装,扩展也不能正确处理已包装的队列(数组的末尾和开头有数据,中间有未使用的元素)。
删除前 25 个元素后,容量为 64,元素 [25..49] 在data
数组中被占用。 当您添加第 15 个新元素 (65) 时,大小仅为 39,因此队列存储不会扩展,并且您写入超过分配空间的末尾。
enqueue
需要用myBack
进行包装,就像dequeue
对myFront
所做的那样,并且需要更改扩展代码以处理包装的队列。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 有关如何处理 vulkan 队列系列的问题
- asio::io_service 具有多个线程的优先级队列处理
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 为什么事件队列未处理我的QT信号
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 接收不一致的访问冲突,处理队列
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- 如何处理多个源队列消息类型
- 为什么在使用队列处理扫雷中的相邻单元格时会出现无限循环?
- 在控制台应用程序中处理空的windows消息队列
- win32消息泵,do dispatchMessage()处理整个消息队列或仅仅是顶部消息
- 未定义的引用C++队列模板处理字符串
- 将队列处理为包含文件的文件夹.可能存在的问题
- 如何处理队列前端和 POP 功能
- 如何处理不同大小的 Linux 消息队列(POSIX 或 SysV)中的信号
- c++处理队列溢出
- 正在处理由双链接列表组成的学生队列
- 如何进行多线程队列处理