在0x00DB4E70检测到堆损坏:在正常块(#151)之后
HEAP CORRUPTION DETECTED: after Normal block(#151) at 0x00DB4E70
我已经为我的类Word实现了一个列表,并且在程序试图删除我的列表时检测到堆损坏。它在析构函数中进入循环并删除第一个元素,然后当他第二次进入循环时,试图销毁"new"头,我得到堆损坏错误。我不明白为什么会出问题。如有任何帮助,不胜感激。
Word.h:
#include <cstring>
class Word
{
protected:
char* word;
char* type;
public:
Word();
Word(char );
Word(char *);
Word(char *, int);
Word(const Word&);
Word& operator=(const Word &);
void setWord(char);
void setWord(char *);
void setWord(char*, int);
void setType(char);
void setType(char*);
void setType(char*, int);
~Word();
};
WordList.h:
#include "Word.h"
#include <cstdlib>
class WordList
{
public:
struct Node
{
Word data;
Node *next, *prev;
//~Node();
};
Node *head;
Node *tail;
WordList();
~WordList();
void add(Word &d);
};
WordList.cpp:
#include "WordList.h"
WordList::WordList(void)
{
head = nullptr;
tail = nullptr;
}
WordList::~WordList(void)
{
while(head != nullptr)
{
Node *n = head->prev;
delete head;
head = n;
}
}
void WordList::add(Word &d)
{
Node *n = new Node;
n->data = d; // I overload =, and it copies information from d to data
n->next = head;
if (head!=nullptr)
head->prev = n;
if(head == nullptr){
head = n;
tail = head;
} else
head = n;
}
在析构函数
Node *n = head->prev;
必须是
Node *n = head->next;
如果您遵循您的add方法,您将看到您从未将n
设置为prev
值,因此head->prev
具有与n->prev
相同的值,您从未设置(为null),使head->prev
具有垃圾值,删除该地址将不美观。
相关文章:
- C++中高效的大型稀疏块压缩线性方程
- 孤立代码块在结构中引发异常
- 如何使用宏中宏后面的代码块
- llvm构建器向基本块添加终止符
- 重新定位图像时如何前进到下一个内存块
- 如何访问超出其块范围的对象?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 等待整个 omp 块完成,然后再调用第二个函数
- 为什么我们将单个或多维数组的大小声明为常量值?
- 计算两个代码块的时间复杂度
- 我正在尝试理解代码块中的这些错误
- 关于条件块的问题与&&运算符有关
- VisualStudios 会抛出异常,而代码块不会 [C++]
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用正则表达式获取大括号块的列表
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 如何在代码块中安装 gtkmm?
- 块和表达式必须具有常量值错误
- 在0x00DB4E70检测到堆损坏:在正常块(#151)之后