0

クラスWordのリストを実装しましたが、プログラムがリストを削除しようとしたときに、ヒープの破損が検出されました。デストラクタでループに入り、最初の要素を削除します。次に、彼が2回目に移動し、「新しい」ヘッドを破棄しようとすると、ヒープ破損エラーが発生します。なぜうまくいかないのかわかりません。どんな助けでも大歓迎です。

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

1 に答える 1

4

デストラクタで

 Node *n = head->prev;

する必要があります

 Node *n = head->next;

add メソッドに従うと、値を設定したことがないため、設定nしたことのない同じ値があり (null に)、ジャンク値のままにして、そのアドレスを削除したことがわかります。かわいくない。prevhead->prevn->prevhead->prev

于 2013-02-28T10:13:55.383 に答える