2012-01-30 46 views
0

刪除我有我的工作簡單的雙向鏈表例子,但由於某些原因,我不斷收到錯誤:pointer being freed was not allocated當我嘗試刪除也不會在C++

這裏是一小段代碼片段插入在列表方法

template <class T> 
void List<T>::insertAtEnd(T *o) 
{ 
    node *newNode = new node; 
    newNode->o = o; 
    newNode->next = NULL; 
    newNode->prev = last; 
    if(last != NULL) 
     last->next = newNode; 
    last = newNode; 
    if(first == NULL) 
     first = newNode; 
    delete(newNode);   // This delete call will usually be in another method 
}        // It is just here right now for testing 

該類有兩個實例字段,一個指針到列表的開始和一個指向結束,第一和最後respecitvely結束。每個節點是一個結構如下:

struct node { 
    node *next; 
    node *prev; 
    T  *o; 
}; 

到目前爲止,我只將1個節點進行測試,但我總是得到同樣的錯誤。但是,如果我註釋掉行

if(first == NULL) 
    first = newNode; 

它的工作原理。請幫助?由於

編輯:第一和最後一個開端,NULL

+0

「first」在哪裏申報? – prelic 2012-01-30 00:56:28

+0

您在此發佈的代碼是否失敗?或者你在談論我們無法看到的其他一些代碼? – 2012-01-30 00:57:18

+0

它是一個全局變量,我在構造函數中設置爲null。同樣去年 – Nosrettap 2012-01-30 00:57:23

回答

2

你,不幸的是,沒有提供你的代碼的全部。您已經省略了包含錯誤的部分,因此我必須推測確切原因。

您所看到的錯誤表示delete正在通過new生成的地址上調用。這可能意味着你在不經意間做了賦值,而不是指針賦值,然後試圖釋放複製(棧上分配)變量。這可能發生的一種具體方式是如果您嘗試delete mynode->o,因爲o可能是堆棧變量的地址。

仔細檢查應該是node*的每種類型是node*,而不是nodenode**。用-Wall -Wextra編寫代碼可能會產生有用的附加警告,如果不是一般慣例,應該是第一個調試步驟。

如果你的類型和分配是正確的,你可能會使用C++庫或編譯器,不給特定的雙免費的消息你;這會擴大你看到的錯誤的範圍,包括釋放兩次相同的內存。嘗試在釋放地址之前嘗試打印地址(或使用調試器達到相同的效果)。當你看到相同的地址出現兩次時,就是這樣。

這可能是顯而易見的,但你不能有delete通話那裏有你的功能工作的權利。 firstlast將指向釋放內存。感覺需要說,以防萬一。

+0

我想你可能已經解決了它。當你說我不能有一個指向釋放內存的指針時,這是否意味着我甚至不能在一秒之內指向它?即使我不使用那個指針?如果是這樣,我應該在刪除之前先將指針設置爲NULL嗎?對不起,我是新來的C++ – Nosrettap 2012-01-30 01:11:00

+0

@Nosrettap不,它可以指向釋放內存,只要你不使用它 - 但這是一個讓它離開的方式。在你有它的'delete'調用時,'first'和'last'將在一次調用後指向釋放內存。 – Borealid 2012-01-30 01:12:35

+0

因爲上面的方法在我刪除之前先設置爲NULL等於NULL – Nosrettap 2012-01-30 01:13:29

1

也許您在使用safe_ptr<T>代替first和/或last?然後,當與NULL或0進行比較時,您需要對T*進行強制轉換。但是我仍然看不到引起的錯誤。

它更有可能的是列表中的析構函數做一個節點上第二刪除。