2013-02-28 62 views
0

我已經爲我的class類實現了一個List,並且在程序試圖刪除我的List時檢測到HEAP CORRUPTION。它在析構函數中進入循環,並刪除第一個元素,然後當他第二次時,並試圖摧毀「新」頭,我得到堆腐敗錯誤。我不明白爲什麼會出錯。任何幫助將非常感激。HEAP CORRUPTION DETECTED:Normal Block(#151)at 0x00DB4E70

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; 
} 
+0

嘗試在應用程序驗證器下運行它 - 發生損壞時可能會遇到斷點。 – Pete 2013-02-28 10:09:15

回答

4

在自毀或

Node *n = head->prev; 

需求是

Node *n = head->next; 

如果你會跟着你添加方法,你會看到,你從來沒有設置nprev值,從而head->prev具有相同的值n->prev有,你從來沒有設置(爲空),留下head->prev與垃圾值,刪除該地址將不會很漂亮。

+2

哦,它有一個;仔細看看如何添加新節點。特別要注意*缺少*取消新節點的'prev'指針。 IOW,它是不確定的,因此會產生下水道猴子。 – WhozCraig 2013-02-28 10:15:12

+0

@WhozCraig你當然是對的。我的術語不夠清晰,我會編輯。 – Boaz 2013-02-28 10:21:33

+0

一個問題,可以很容易地通過具有類節點的構造函數來解決,例如:Node(constWord&val):data(val),next(),prev(){}' – WhozCraig 2013-02-28 10:24:43