我的程序无法正常工作。它应该是一个简单的程序,可以在操作系统上模拟就绪队列。它使用优先级队列来存储过程对象(称为PCB),并使用一个称为CPU的PCB指针来跟踪CPU中的哪个进程。该程序的重​​点是应该回收PCB而不破坏它们。

我遇到的问题是,当我出局PCB并将其分配给指针时,会收到此错误:


  错误:使用临时地址[-fpermissive]


代码如下所示:

void OSSim::createProcess(){
        PCB * newP;
        if(unusedPCBs.isEmpty())    //unusedPCBs is a priorityQueue
            newP = new PCB();
        else{
            newP = &(unusedPCBs.dequeue());   // THIS LINE IS CAUSING THE ERROR
        }
        newP->PID = pidCounter;
        pidCounter++;
        std::cout << "Process ID " << newP->PID << " created";
        if(CPU == 0){
            CPU = newP;
            std::cout << " and moved to CPU\n";
        } else {
            readyQueue.enqueue(*newP);
            std::cout << " and moved to the Ready Queue\n";
        }
}


因此,我搜索了StackOverflow并找到了一个解决方案,该方法是创建一个临时的新PCB(从已出队的PCB),然后将指针指向该PCB:

void OSSim::createProcess(){
        PCB * newP;
        PCB temp;
        if(unusedPCBs.isEmpty())    //unusedPCBs is a priorityQueue
            newP = new PCB();
        else{
            temp = unusedPCBs.dequeue();   // THE "FIX"
            newP = &temp;
        }
        newP->PID = pidCounter;
        pidCounter++;
        std::cout << "Process ID " << newP->PID << " created";
        if(CPU == 0){
            CPU = newP;
            std::cout << " and moved to CPU\n";
        } else {
            readyQueue.enqueue(*newP);
            std::cout << " and moved to the Ready Queue\n";
        }
}


但是,这样做的问题是指针指向在本地创建的PCB对象,因此一旦函数结束,它就会消失。稍后当我尝试引用相同的PCB时,我发现它保存的数据已损坏。

所以我觉得自己陷入了困境。我的目标是在PCB对象退队后重新使用它,而不破坏它并创建一个新对象。当我尝试使用指针捕获它时,出现“临时地址”错误,并且当我尝试通过临时创建一个新的PCB对象来存储它来捕获它时,
该对象在本地声明,并在例程结束后销毁。

任何建议将不胜感激。非常感谢。

另外,这是我的dequeue()函数:

template <typename T>
T PriorityQueue<T>::dequeue(){
    if(isEmpty()){
        std::cout << "\n\nWARNING: Trying to dequeue empty queue\n\n";
        throw 3;
    } else {
        Node * frontNode = head;
        T result = frontNode -> data;
        if(size == 1){
            head = 0;
            tail = 0;
        } else {
            head = frontNode -> prev;
            head -> next = 0;
        }
        delete frontNode;
        size--;
        return result;
    }
}

最佳答案

复制在堆上构造一个新的PCB。

    if(unusedPCBs.isEmpty())
        newP = new PCB();
    else{
        newP = new PCB( unusedPCBs.dequeue() );
    }

09-25 20:23