我的程序无法正常工作。它应该是一个简单的程序,可以在操作系统上模拟就绪队列。它使用优先级队列来存储过程对象(称为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() );
}