Получение ошибки при использовании delete [] cpp

Повреждение кучи обнаружено после нормального блока # 151, когда я пытаюсь использовать delete[] в моем коде

#include "Queue.h"
void main() {
queue* stk = new queue;
initQueue(stk, 4);
enqueue(stk, 9);
enqueue(stk, 4);
enqueue(stk, 3);
enqueue(stk, 7);

while (!isEmpty(stk)) {
std::cout << "Popping number:" << dequeue(stk) << std::endl;
}

cleanQueue(stk);
delete stk;

system("Pause");
}

Это функция удаления:

void cleanQueue(queue* q) {
delete[] q->_elements;
}

это структура:

typedef struct queue
{
int * _elements;
int _maxSize;
int _count;
} queue;

Может кто-нибудь сказать, пожалуйста, почему это происходит и что я должен сделать, чтобы это исправить?
Благодарю.

        #include "Queue.h"void enqueue(queue* q, unsigned int newValue) {
int i = 0;
if (!isFull(q)) {
q->_count++;
q->_elements[0] = newValue;
for (i = q->_count; i > 0; i--) {
q->_elements[i] = q->_elements[i - 1];
}
}
}

int dequeue(queue* q) {
int ans = -1;

if (!isEmpty(q)) {
ans = q->_elements[q->_count];
q->_count--;

}
return(ans);
}

void initQueue(queue* q, unsigned int size) {
q->_count = 0;
q->_maxSize = size;
q->_elements = new int[size];
}

void cleanQueue(queue* q) {
delete[] q->_elements;
}

bool isFull(queue* q) {
return(q->_count == q->_maxSize);
}

bool isEmpty(queue* q) {
return(q->_count == 0);
}

0

Решение

Представьте, что в вашей очереди есть один элемент, и ваш maxSize также равен 1.
Он не пустой, поэтому вы продолжаете читать значение в _count в элементах.
Поэтому он читает элементы [1] (поскольку _count равен 1), когда единственный элемент находится в элементах [0]. Если это проходит после окончания вашего выделения, у вас будет ошибка памяти (неопределенное поведение), но вы всегда будете читать неправильное значение.

int dequeue(queue* q) {
int ans = -1;

if (!isEmpty(q)) {
ans = q->_elements[q->_count];
q->_count--;

}
return(ans);
}

Вы, вероятно, хотите вычесть один из _count.

Ваша очередь также имеет логическую ошибку, так как вы перемещаете свои элементы после Вы пишете новое значение, поэтому вы что-то переписали.

void enqueue(queue* q, unsigned int newValue) {
int i = 0;
if (!isFull(q)) {
q->_count++;
q->_elements[0] = newValue; // <<<<<<<< Here.
for (i = q->_count; i > 0; i--) {
q->_elements[i] = q->_elements[i - 1];
}
}
}
0

Другие решения

В вашей функции enqueue значение count достигает 4. Затем вы пытаетесь обратиться к нему в цикле for как q-> elements [4], в то время как самый высокий индекс в вашем массиве равен 3.

0

Как сказал Алекс, ваш enqueue() функция имеет ошибку. Попробуйте следующий код.

void enqueue(queue* q, unsigned int newValue) {
int i = 0;
if (!isFull(q)) {
for (i = q->_count; i > 0; i--) {
q->_elements[i] = q->_elements[i - 1];
}
q->_elements[0] = newValue;
q->_count++;
}
}
0
По вопросам рекламы [email protected]