我在使程序运行时遇到了一些麻烦。它应该是一个简单的程序,模拟操作系统上的就绪队列。它使用优先级队列来存储过程对象(称为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;
}
}
答案 0 :(得分:2)
复制在堆上构建一个新PCB。
if(unusedPCBs.isEmpty())
newP = new PCB();
else{
newP = new PCB( unusedPCBs.dequeue() );
}