c++ - [C++] 在此代码之前不存在的析构函数中抛出的内存错误。尝试制作一个新的动态数组并填充它

标签 c++ data-structures priority-queue

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

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。当它们都具有相同的优先级时,它当然可以正常工作,但是当我优先级上升时,它会在我的析构函数中抛出一个错误。

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

最佳答案

queueArray 是一个 dangling pointer在此之后:

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

因为 queueArray 指向的内存已被删除d。任何访问或销毁 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];
}

关于c++ - [C++] 在此代码之前不存在的析构函数中抛出的内存错误。尝试制作一个新的动态数组并填充它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16098812/

相关文章:

python - 在任务队列中实现消息优先级

c++ - 如何使用 QsqlQuery 获取最后准备和执行的查询?

c# - 为什么.NET中队列的底层实现要用数组?

javascript - 根据数组元素的总和对数组中的元素进行排序

javascript - 如何在javascript中建立计数和说出问题

c++ - 使用 std::shared_ptr 的 std::priority_queue 派生类的编译错误

java - 为什么我不能使用 "String"作为优先级队列的参数?

c++ - ipv4存储的数据结构+算法——高效的前缀搜索

c++ - _mm_store_si128 抛出异常

c++ - 在 C/C++ 中的两个文件之间传递静态变量