使用 delete[] cpp 时出错

Getting an error when using delete[] cpp

本文关键字:出错 cpp delete 使用      更新时间:2023-10-16

当我尝试在代码中使用delete[]时,在正常块 #151 后检测到堆损坏

#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);
}

假设你的队列中有一个元素,你的 maxSize 也是 1。它不为空,因此您继续读取元素中_count的值。因此,当唯一的元素位于 elements[0] 时,它会读取元素 [1](因为_count是 1)。 如果超过分配结束,您将遇到内存错误(未定义的行为),但您总是会读取错误的值。

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];
        }
    }
}

在排队函数中,计数的值达到 4。然后,您尝试在 for 循环中以 q->elements[4] 的形式访问它,而数组中的最高索引为 3。

正如 Alex 提到的,你的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++;
    }
}