如何避免"采取临时的#34;没问题?

时间:2014-10-25 16:31:55

标签: c++ pointers

我在使程序运行时遇到了一些麻烦。它应该是一个简单的程序,模拟操作系统上的就绪队列。它使用优先级队列来存储过程对象(称为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(来自正在出列的那个),然后将指针指向它:

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时,我发现它所持有的数据已被破坏。

所以我觉得自己陷入困境22。我的目标是在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;
    }
}

1 个答案:

答案 0 :(得分:2)

复制在堆上构建一个新PCB。

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