1

我正在一个处理队列的实验室工作,我认为这并不完全相关。我的任务是创建一个“优先队列”,我能想到的最好方法如下

void IntQueue::enqueue(int num,int priorityOfEntry)
{   
    if (isFull())
        cout << "The queue is full.\n";
    else
    {   
        // Calculate the new rear position
        //insert correct lab code here haha
        if (priorityOfEntry == 1)
        {   
            rear = (rear + 1) % queueSize;
            queueArray[rear] = num;
            queueSize++;
        }   
        else if (priorityOfEntry == 2)
        {   

            queueSize++;

            int* newArray = new int[queueSize];
            newArray[0] = num;

            for(int counter = 0;counter< queueSize; counter++)
            {   
                newArray[counter+1] = queueArray[counter];
            }   

            queueArray = newArray;

            delete [] newArray;

        }   
        else cout << "invalid priority" << endl;

        // Insert new item


        // Update item count
        numItems++;


    }   
}   

我只有 2 个优先级,1 和 2,我在主程序中进行了解释。当它们都具有相同的优先级时,它当然可以正常工作,但是当我提高优先级时,它会在我的析构函数中引发错误。

我真的不认为这是接近这个实验室的正确方法,但它似乎有效.. 至少如果我真的能修复这个内存错误。我认为唯一的问题可能是我更改了析构函数认为它将删除的地址。但我认为指针已经可以解释这一点。我知道我需要学习调试自己的程序。我真的。但有时我只是盯着代码看,那里只有一堵砖墙。猜猜这就是朝着正确方向轻推的目的。

4

3 回答 3

4

queueArray在此之后是一个悬空指针

  queueArray = newArray; // Both 'queueArray' and 'newArray' point to
                         // the same memory after this assignment. 
  delete [] newArray;

queueArray因为指向的内存是deleted。任何访问或销毁的尝试queueArray都是在访问已经被销毁的内存。正确的顺序是:

delete[] queueArray;
queueArray = newArray;

for此外,在执行复制的循环中存在潜在的越界访问:

for(int counter = 0;counter< queueSize; counter++)
{
    // When 'counter == queueSize - 1'
    // 'newArray[counter + 1]' is one past the end.
    newArray[counter+1] = queueArray[counter];
}
于 2013-04-19T06:49:05.700 回答
2

这里:

queueArray = newArray; // queueArray and newArray point to the same place
delete [] newArray;    // that place gets delete[]ed

queueArray指向与 相同的位置newArray,但随后您将删除位于该位置的数组。queueArray剩下的就是指向你已经归还给操作系统的内存,即它现在是一个悬空指针

你需要delete queueArray[]先,然后分配newArray给它。

于 2013-04-19T06:49:26.720 回答
0

好的,我明白了,我不知道为什么我认为我需要在优先级切换时添加另一个数组成员,我想我只是累了。

所以这是额外的数组成员,我认为这是唯一的另一个问题

于 2013-04-19T07:04:04.893 回答