gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:53:33 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com