C++队列pop()函数无法正常执行问题排查求助
问题分析与修复
首先看你代码里second_write函数里的pop()调用,这里有明显的语法错误,直接导致它无法正常工作,另外还有几个逻辑和参数传递的问题,我一一给你拆解:
核心问题:pop()调用的语法错误
你写了* * s.pop();,但std::queue::pop()是一个**无返回值(void)**的成员函数——它只是负责移除队列的首元素,不会返回任何内容,所以这里的两层解引用* *完全是多余的,而且会直接触发编译错误。正确的写法就是直接调用:
s.pop();
次要问题:队列的按值传递导致副本失效
你的second_write函数参数是queue <process> s,这是按值传递,意味着函数会创建一个原队列的副本。你在函数里对s进行的所有操作(包括pop)都只会影响这个副本,而不会改变main函数里的原队列。如果你的意图是操作原队列,应该把参数改成引用传递:
void second_write(queue <process>& s, int n, int quantum)
(注意参数里的&符号,这样操作的就是原队列本身了)
顺带修复的逻辑错误
除了pop()的问题,你的代码还有几个会影响结果正确性的逻辑错误:
- 周转时间计算错误:
你写的turn_arround_time[i] = burst_Time[i] - waitting_time[i];完全不符合逻辑,周转时间应该是等待时间 + 实际执行时间,正确写法是:turn_arround_time[i] = waitting_time[i] + burst_Time[i]; - 平均时间计算的整数除法问题:
直接用total_turn_arround / n会因为整数除法丢失精度,需要先把其中一个值转成浮点型:avgturn_arround = static_cast<float>(total_turn_arround) / n; avgwaiting_time = static_cast<float>(total_waiting) / n; - 内存泄漏风险:
你动态分配了多个数组,但没有释放,需要在函数结束前添加delete[]语句。
修正后的second_write关键代码片段
// 改成引用传递,避免操作副本 void second_write(queue <process>& s, int n, int quantum) { int* burst_Time = new int[n], total_time = 0, total_turn_arround = 0, total_waiting = 0; float avgwaiting_time = 0, avgturn_arround = 0; int* remaining_burst_time = new int[n]; int* waitting_time = new int[n]; int* turn_arround_time = new int[n]; process temp; queue <process> qtemp; for (int i = 0; i < n; i++) { temp = s.front(); burst_Time[i] = temp.burst; qtemp.push(temp); s.pop(); // 修正:直接调用pop,去掉多余的解引用 cout << temp.name << "\t" << temp.arrival << "\t" << temp.burst << "\t" << temp.priority << endl; } // 初始化剩余执行时间和等待时间 for (int i = 0; i < n; i++) { remaining_burst_time[i] = burst_Time[i]; waitting_time[i] = 0; } while (true) { bool finished = true; for (int i = 0; i < n; i++) { if (remaining_burst_time[i] > 0) { finished = false; if (remaining_burst_time[i] > quantum) { total_time += quantum; remaining_burst_time[i] -= quantum; } else { total_time += remaining_burst_time[i]; waitting_time[i] = total_time - burst_Time[i]; remaining_burst_time[i] = 0; } } } if (finished) break; } // 修正周转时间计算逻辑 for (int i = 0; i < n; i++) { turn_arround_time[i] = waitting_time[i] + burst_Time[i]; } // 累计总和 for (int i = 0; i < n; i++) { total_waiting += waitting_time[i]; total_turn_arround += turn_arround_time[i]; } // 修正浮点数计算精度问题 avgturn_arround = static_cast<float>(total_turn_arround) / n; avgwaiting_time = static_cast<float>(total_waiting) / n; // 输出结果示例 cout << "\n=== 调度结果 ===" << endl; cout << "平均等待时间: " << avgwaiting_time << endl; cout << "平均周转时间: " << avgturn_arround << endl; // 释放动态分配的内存,避免泄漏 delete[] burst_Time; delete[] remaining_burst_time; delete[] waitting_time; delete[] turn_arround_time; }
总结
- 解决
pop()无法工作的核心是移除错误的解引用操作,直接调用s.pop(); - 用引用传递队列,避免操作无效的副本
- 修复周转时间计算和平均时间精度的逻辑错误
- 记得释放动态内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者Boudy Hesham
相关产品推荐
相关产品推荐

