使用 delete[] cpp 时出错
Getting an error when using delete[] cpp
当我尝试在我的代码中使用 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);
}
在您的入队函数中,count 的值达到 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++;
}
}
假设您的队列中有一个元素,并且您的 maxSize 也是 1。
它不是空的,因此您继续读取元素中 _count 处的值。
因此当唯一的元素位于 elements[0] 时,它读取 elements[1](因为 _count 为 1)。如果超出了分配的末尾,您将遇到内存错误(未定义的行为),但您总是会读取错误的值。
int dequeue(queue* q) {
int ans = -1;
if (!isEmpty(q)) {
ans = q->_elements[q->_count];
q->_count--;
}
return(ans);
}
您可能想从 _count 中减去 1。
您的入队看起来也有逻辑错误,因为您在 之后 移动了您的元素,您写了您的新值,所以您覆盖了一些东西。
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];
}
}
}
当我尝试在我的代码中使用 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);
}
在您的入队函数中,count 的值达到 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++;
}
}
假设您的队列中有一个元素,并且您的 maxSize 也是 1。 它不是空的,因此您继续读取元素中 _count 处的值。 因此当唯一的元素位于 elements[0] 时,它读取 elements[1](因为 _count 为 1)。如果超出了分配的末尾,您将遇到内存错误(未定义的行为),但您总是会读取错误的值。
int dequeue(queue* q) {
int ans = -1;
if (!isEmpty(q)) {
ans = q->_elements[q->_count];
q->_count--;
}
return(ans);
}
您可能想从 _count 中减去 1。
您的入队看起来也有逻辑错误,因为您在 之后 移动了您的元素,您写了您的新值,所以您覆盖了一些东西。
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];
}
}
}