在0x00DB4E70检测到堆损坏:在正常块(#151)之后

HEAP CORRUPTION DETECTED: after Normal block(#151) at 0x00DB4E70

本文关键字:常块 #151 之后 0x00DB4E70 检测 损坏      更新时间:2023-10-16

我已经为我的类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具有垃圾值,删除该地址将不美观。