You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()的问题,你的代码还有几个会影响结果正确性的逻辑错误:

  1. 周转时间计算错误:
    你写的turn_arround_time[i] = burst_Time[i] - waitting_time[i];完全不符合逻辑,周转时间应该是等待时间 + 实际执行时间,正确写法是:
    turn_arround_time[i] = waitting_time[i] + burst_Time[i];
    
  2. 平均时间计算的整数除法问题:
    直接用total_turn_arround / n会因为整数除法丢失精度,需要先把其中一个值转成浮点型:
    avgturn_arround = static_cast<float>(total_turn_arround) / n;
    avgwaiting_time = static_cast<float>(total_waiting) / n;
    
  3. 内存泄漏风险:
    你动态分配了多个数组,但没有释放,需要在函数结束前添加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;
}

总结

  1. 解决pop()无法工作的核心是移除错误的解引用操作,直接调用s.pop();
  2. 用引用传递队列,避免操作无效的副本
  3. 修复周转时间计算和平均时间精度的逻辑错误
  4. 记得释放动态内存,避免内存泄漏

内容的提问来源于stack exchange,提问作者Boudy Hesham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:40